Merge remote-tracking branch 'upstream/dev' into feat/oauth
This commit is contained in:
+25
@@ -28,6 +28,10 @@ math {
|
||||
@apply rounded-lg;
|
||||
}
|
||||
|
||||
.markdown a {
|
||||
@apply underline;
|
||||
}
|
||||
|
||||
ol > li {
|
||||
counter-increment: list-number;
|
||||
display: block;
|
||||
@@ -92,10 +96,18 @@ select {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.scrollbar-hidden::-webkit-scrollbar-corner {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scrollbar-none::-webkit-scrollbar {
|
||||
display: none; /* for Chrome, Safari and Opera */
|
||||
}
|
||||
|
||||
.scrollbar-none::-webkit-scrollbar-corner {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scrollbar-none {
|
||||
-ms-overflow-style: none; /* IE and Edge */
|
||||
scrollbar-width: none; /* Firefox */
|
||||
@@ -111,3 +123,16 @@ input::-webkit-inner-spin-button {
|
||||
input[type='number'] {
|
||||
-moz-appearance: textfield; /* Firefox */
|
||||
}
|
||||
|
||||
.cm-editor {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.cm-scroller {
|
||||
@apply scrollbar-hidden;
|
||||
}
|
||||
|
||||
.cm-editor.cm-focused {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
+124
-11
@@ -32,6 +32,9 @@
|
||||
} else if (localStorage.theme && localStorage.theme === 'system') {
|
||||
systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
document.documentElement.classList.add(systemTheme ? 'dark' : 'light');
|
||||
} else if (localStorage.theme && localStorage.theme === 'her') {
|
||||
document.documentElement.classList.add('dark');
|
||||
document.documentElement.classList.add('her');
|
||||
} else {
|
||||
document.documentElement.classList.add('dark');
|
||||
}
|
||||
@@ -59,15 +62,7 @@
|
||||
|
||||
<div
|
||||
id="splash-screen"
|
||||
style="
|
||||
position: fixed;
|
||||
z-index: 100;
|
||||
background: #fff;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
"
|
||||
style="position: fixed; z-index: 100; top: 0; left: 0; width: 100%; height: 100%"
|
||||
>
|
||||
<style type="text/css" nonce="">
|
||||
html {
|
||||
@@ -76,20 +71,138 @@
|
||||
</style>
|
||||
|
||||
<img
|
||||
id="logo"
|
||||
style="
|
||||
position: absolute;
|
||||
width: 6rem;
|
||||
height: 6rem;
|
||||
top: 46%;
|
||||
top: 41%;
|
||||
left: 50%;
|
||||
margin: -40px 0 0 -40px;
|
||||
margin-left: -3rem;
|
||||
"
|
||||
src="/logo.svg"
|
||||
/>
|
||||
|
||||
<div
|
||||
style="
|
||||
position: absolute;
|
||||
top: 33%;
|
||||
left: 50%;
|
||||
|
||||
width: 24rem;
|
||||
margin-left: -12rem;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
"
|
||||
>
|
||||
<img
|
||||
id="logo-her"
|
||||
style="width: 13rem; height: 13rem"
|
||||
src="/logo.svg"
|
||||
class="animate-pulse-fast"
|
||||
/>
|
||||
|
||||
<div style="position: relative; width: 24rem; margin-top: 0.5rem">
|
||||
<div
|
||||
id="progress-background"
|
||||
style="
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 0.75rem;
|
||||
|
||||
border-radius: 9999px;
|
||||
background-color: #fafafa9a;
|
||||
"
|
||||
></div>
|
||||
|
||||
<div
|
||||
id="progress-bar"
|
||||
style="
|
||||
position: absolute;
|
||||
width: 0%;
|
||||
height: 0.75rem;
|
||||
border-radius: 9999px;
|
||||
background-color: #fff;
|
||||
"
|
||||
class="bg-white"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <span style="position: absolute; bottom: 32px; left: 50%; margin: -36px 0 0 -36px">
|
||||
Footer content
|
||||
</span> -->
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<style type="text/css" nonce="">
|
||||
html {
|
||||
overflow-y: hidden !important;
|
||||
}
|
||||
|
||||
#splash-screen {
|
||||
background: #fff;
|
||||
}
|
||||
html.dark #splash-screen {
|
||||
background: #000;
|
||||
}
|
||||
|
||||
html.dark #splash-screen img {
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
html.her #splash-screen {
|
||||
background: #983724;
|
||||
}
|
||||
|
||||
#logo-her {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#progress-background {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#progress-bar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
html.her #logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
html.her #logo-her {
|
||||
display: block;
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
html.her #progress-background {
|
||||
display: block;
|
||||
}
|
||||
|
||||
html.her #progress-bar {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@media (max-width: 24rem) {
|
||||
html.her #progress-background {
|
||||
display: none;
|
||||
}
|
||||
|
||||
html.her #progress-bar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
50% {
|
||||
opacity: 0.65;
|
||||
}
|
||||
}
|
||||
.animate-pulse-fast {
|
||||
animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -98,7 +98,7 @@ export const synthesizeOpenAISpeech = async (
|
||||
token: string = '',
|
||||
speaker: string = 'alloy',
|
||||
text: string = '',
|
||||
model: string = 'tts-1'
|
||||
model?: string
|
||||
) => {
|
||||
let error = null;
|
||||
|
||||
@@ -109,9 +109,9 @@ export const synthesizeOpenAISpeech = async (
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model: model,
|
||||
input: text,
|
||||
voice: speaker
|
||||
voice: speaker,
|
||||
...(model && { model })
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
|
||||
@@ -76,7 +76,10 @@ export const getDocs = async (token: string = '') => {
|
||||
export const getDocByName = async (token: string, name: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/documents/name/${name}`, {
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('name', name);
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/documents/docs?${searchParams.toString()}`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
@@ -113,7 +116,10 @@ type DocUpdateForm = {
|
||||
export const updateDocByName = async (token: string, name: string, form: DocUpdateForm) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/documents/name/${name}/update`, {
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('name', name);
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/documents/doc/update?${searchParams.toString()}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
@@ -154,7 +160,10 @@ type TagDocForm = {
|
||||
export const tagDocByName = async (token: string, name: string, form: TagDocForm) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/documents/name/${name}/tags`, {
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('name', name);
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/documents/doc/tags?${searchParams.toString()}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
@@ -190,7 +199,10 @@ export const tagDocByName = async (token: string, name: string, form: TagDocForm
|
||||
export const deleteDocByName = async (token: string, name: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/documents/name/${name}/delete`, {
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('name', name);
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/documents/doc/delete?${searchParams.toString()}`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -104,6 +104,195 @@ export const chatCompleted = async (token: string, body: ChatCompletedForm) => {
|
||||
return res;
|
||||
};
|
||||
|
||||
export const getTaskConfig = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/task/config`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
...(token && { authorization: `Bearer ${token}` })
|
||||
}
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
error = err;
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const updateTaskConfig = async (token: string, config: object) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/task/config/update`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
...(token && { authorization: `Bearer ${token}` })
|
||||
},
|
||||
body: JSON.stringify(config)
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
} else {
|
||||
error = err;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const generateTitle = async (
|
||||
token: string = '',
|
||||
model: string,
|
||||
prompt: string,
|
||||
chat_id?: string
|
||||
) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/task/title/completions`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${token}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model: model,
|
||||
prompt: prompt,
|
||||
...(chat_id && { chat_id: chat_id })
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res?.choices[0]?.message?.content.replace(/["']/g, '') ?? 'New Chat';
|
||||
};
|
||||
|
||||
export const generateEmoji = async (
|
||||
token: string = '',
|
||||
model: string,
|
||||
prompt: string,
|
||||
chat_id?: string
|
||||
) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/task/emoji/completions`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${token}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model: model,
|
||||
prompt: prompt,
|
||||
...(chat_id && { chat_id: chat_id })
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
const response = res?.choices[0]?.message?.content.replace(/["']/g, '') ?? null;
|
||||
|
||||
if (response) {
|
||||
if (/\p{Extended_Pictographic}/u.test(response)) {
|
||||
return response.match(/\p{Extended_Pictographic}/gu)[0];
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
export const generateSearchQuery = async (
|
||||
token: string = '',
|
||||
model: string,
|
||||
messages: object[],
|
||||
prompt: string
|
||||
) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/task/query/completions`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${token}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model: model,
|
||||
messages: messages,
|
||||
prompt: prompt
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res?.choices[0]?.message?.content.replace(/["']/g, '') ?? prompt;
|
||||
};
|
||||
|
||||
export const getPipelinesList = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
@@ -133,6 +322,43 @@ export const getPipelinesList = async (token: string = '') => {
|
||||
return pipelines;
|
||||
};
|
||||
|
||||
export const uploadPipeline = async (token: string, file: File, urlIdx: string) => {
|
||||
let error = null;
|
||||
|
||||
// Create a new FormData object to handle the file upload
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
formData.append('urlIdx', urlIdx);
|
||||
|
||||
const res = await fetch(`${WEBUI_BASE_URL}/api/pipelines/upload`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
...(token && { authorization: `Bearer ${token}` })
|
||||
// 'Content-Type': 'multipart/form-data' is not needed as Fetch API will set it automatically
|
||||
},
|
||||
body: formData
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
if ('detail' in err) {
|
||||
error = err.detail;
|
||||
} else {
|
||||
error = err;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const downloadPipeline = async (token: string, url: string, urlIdx: string) => {
|
||||
let error = null;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import { WEBUI_API_BASE_URL } from '$lib/constants';
|
||||
export const getMemories = async (token: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/memories`, {
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/memories/`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
@@ -59,6 +59,37 @@ export const addNewMemory = async (token: string, content: string) => {
|
||||
return res;
|
||||
};
|
||||
|
||||
export const updateMemoryById = async (token: string, id: string, content: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/memories/${id}/update`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
content: content
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const queryMemory = async (token: string, content: string) => {
|
||||
let error = null;
|
||||
|
||||
|
||||
@@ -0,0 +1,193 @@
|
||||
import { WEBUI_API_BASE_URL } from '$lib/constants';
|
||||
|
||||
export const createNewTool = async (token: string, tool: object) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/create`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
...tool
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const getTools = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/`, {
|
||||
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 exportTools = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/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 getToolById = async (token: string, id: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/id/${id}`, {
|
||||
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 updateToolById = async (token: string, id: string, tool: object) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/id/${id}/update`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
...tool
|
||||
})
|
||||
})
|
||||
.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 deleteToolById = async (token: string, id: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/id/${id}/delete`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
}
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.then((json) => {
|
||||
return json;
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
@@ -22,6 +22,39 @@ export const getGravatarUrl = async (email: string) => {
|
||||
return res;
|
||||
};
|
||||
|
||||
export const formatPythonCode = async (code: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/utils/code/format`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
code: code
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
|
||||
error = err;
|
||||
if (err.detail) {
|
||||
error = err.detail;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const downloadChatAsPDF = async (chat: object) => {
|
||||
let error = null;
|
||||
|
||||
|
||||
@@ -0,0 +1,390 @@
|
||||
<script>
|
||||
import { getContext, tick } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
import Database from './Settings/Database.svelte';
|
||||
|
||||
import General from './Settings/General.svelte';
|
||||
import Users from './Settings/Users.svelte';
|
||||
|
||||
import Pipelines from './Settings/Pipelines.svelte';
|
||||
import Audio from './Settings/Audio.svelte';
|
||||
import Images from './Settings/Images.svelte';
|
||||
import Interface from './Settings/Interface.svelte';
|
||||
import Models from './Settings/Models.svelte';
|
||||
import Connections from './Settings/Connections.svelte';
|
||||
import Documents from './Settings/Documents.svelte';
|
||||
import WebSearch from './Settings/WebSearch.svelte';
|
||||
import { config } from '$lib/stores';
|
||||
import { getBackendConfig } from '$lib/apis';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let selectedTab = 'general';
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col lg:flex-row w-full h-full py-2 lg:space-x-4">
|
||||
<div
|
||||
class="tabs flex flex-row overflow-x-auto space-x-1 max-w-full lg:space-x-0 lg:space-y-1 lg:flex-col lg:flex-none lg:w-44 dark:text-gray-200 text-xs text-left scrollbar-none"
|
||||
>
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 lg:flex-none flex text-right transition {selectedTab ===
|
||||
'general'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'general';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M6.955 1.45A.5.5 0 0 1 7.452 1h1.096a.5.5 0 0 1 .497.45l.17 1.699c.484.12.94.312 1.356.562l1.321-1.081a.5.5 0 0 1 .67.033l.774.775a.5.5 0 0 1 .034.67l-1.08 1.32c.25.417.44.873.561 1.357l1.699.17a.5.5 0 0 1 .45.497v1.096a.5.5 0 0 1-.45.497l-1.699.17c-.12.484-.312.94-.562 1.356l1.082 1.322a.5.5 0 0 1-.034.67l-.774.774a.5.5 0 0 1-.67.033l-1.322-1.08c-.416.25-.872.44-1.356.561l-.17 1.699a.5.5 0 0 1-.497.45H7.452a.5.5 0 0 1-.497-.45l-.17-1.699a4.973 4.973 0 0 1-1.356-.562L4.108 13.37a.5.5 0 0 1-.67-.033l-.774-.775a.5.5 0 0 1-.034-.67l1.08-1.32a4.971 4.971 0 0 1-.561-1.357l-1.699-.17A.5.5 0 0 1 1 8.548V7.452a.5.5 0 0 1 .45-.497l1.699-.17c.12-.484.312-.94.562-1.356L2.629 4.107a.5.5 0 0 1 .034-.67l.774-.774a.5.5 0 0 1 .67-.033L5.43 3.71a4.97 4.97 0 0 1 1.356-.561l.17-1.699ZM6 8c0 .538.212 1.026.558 1.385l.057.057a2 2 0 0 0 2.828-2.828l-.058-.056A2 2 0 0 0 6 8Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('General')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'users'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'users';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M8 8a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5ZM3.156 11.763c.16-.629.44-1.21.813-1.72a2.5 2.5 0 0 0-2.725 1.377c-.136.287.102.58.418.58h1.449c.01-.077.025-.156.045-.237ZM12.847 11.763c.02.08.036.16.046.237h1.446c.316 0 .554-.293.417-.579a2.5 2.5 0 0 0-2.722-1.378c.374.51.653 1.09.813 1.72ZM14 7.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0ZM3.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM5 13c-.552 0-1.013-.455-.876-.99a4.002 4.002 0 0 1 7.753 0c.136.535-.324.99-.877.99H5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Users')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'connections'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'connections';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M1 9.5A3.5 3.5 0 0 0 4.5 13H12a3 3 0 0 0 .917-5.857 2.503 2.503 0 0 0-3.198-3.019 3.5 3.5 0 0 0-6.628 2.171A3.5 3.5 0 0 0 1 9.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Connections')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'models'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'models';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M10 1c3.866 0 7 1.79 7 4s-3.134 4-7 4-7-1.79-7-4 3.134-4 7-4zm5.694 8.13c.464-.264.91-.583 1.306-.952V10c0 2.21-3.134 4-7 4s-7-1.79-7-4V8.178c.396.37.842.688 1.306.953C5.838 10.006 7.854 10.5 10 10.5s4.162-.494 5.694-1.37zM3 13.179V15c0 2.21 3.134 4 7 4s7-1.79 7-4v-1.822c-.396.37-.842.688-1.306.953-1.532.875-3.548 1.369-5.694 1.369s-4.162-.494-5.694-1.37A7.009 7.009 0 013 13.179z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Models')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'documents'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'documents';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path d="M11.625 16.5a1.875 1.875 0 1 0 0-3.75 1.875 1.875 0 0 0 0 3.75Z" />
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5H9a3.75 3.75 0 0 1 3.75 3.75v1.875c0 1.036.84 1.875 1.875 1.875H16.5a3.75 3.75 0 0 1 3.75 3.75v7.875c0 1.035-.84 1.875-1.875 1.875H5.625a1.875 1.875 0 0 1-1.875-1.875V3.375c0-1.036.84-1.875 1.875-1.875Zm6 16.5c.66 0 1.277-.19 1.797-.518l1.048 1.048a.75.75 0 0 0 1.06-1.06l-1.047-1.048A3.375 3.375 0 1 0 11.625 18Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M14.25 5.25a5.23 5.23 0 0 0-1.279-3.434 9.768 9.768 0 0 1 6.963 6.963A5.23 5.23 0 0 0 16.5 7.5h-1.875a.375.375 0 0 1-.375-.375V5.25Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Documents')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'web'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'web';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M21.721 12.752a9.711 9.711 0 0 0-.945-5.003 12.754 12.754 0 0 1-4.339 2.708 18.991 18.991 0 0 1-.214 4.772 17.165 17.165 0 0 0 5.498-2.477ZM14.634 15.55a17.324 17.324 0 0 0 .332-4.647c-.952.227-1.945.347-2.966.347-1.021 0-2.014-.12-2.966-.347a17.515 17.515 0 0 0 .332 4.647 17.385 17.385 0 0 0 5.268 0ZM9.772 17.119a18.963 18.963 0 0 0 4.456 0A17.182 17.182 0 0 1 12 21.724a17.18 17.18 0 0 1-2.228-4.605ZM7.777 15.23a18.87 18.87 0 0 1-.214-4.774 12.753 12.753 0 0 1-4.34-2.708 9.711 9.711 0 0 0-.944 5.004 17.165 17.165 0 0 0 5.498 2.477ZM21.356 14.752a9.765 9.765 0 0 1-7.478 6.817 18.64 18.64 0 0 0 1.988-4.718 18.627 18.627 0 0 0 5.49-2.098ZM2.644 14.752c1.682.971 3.53 1.688 5.49 2.099a18.64 18.64 0 0 0 1.988 4.718 9.765 9.765 0 0 1-7.478-6.816ZM13.878 2.43a9.755 9.755 0 0 1 6.116 3.986 11.267 11.267 0 0 1-3.746 2.504 18.63 18.63 0 0 0-2.37-6.49ZM12 2.276a17.152 17.152 0 0 1 2.805 7.121c-.897.23-1.837.353-2.805.353-.968 0-1.908-.122-2.805-.353A17.151 17.151 0 0 1 12 2.276ZM10.122 2.43a18.629 18.629 0 0 0-2.37 6.49 11.266 11.266 0 0 1-3.746-2.504 9.754 9.754 0 0 1 6.116-3.985Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Web Search')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'interface'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'interface';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M2 4.25A2.25 2.25 0 0 1 4.25 2h7.5A2.25 2.25 0 0 1 14 4.25v5.5A2.25 2.25 0 0 1 11.75 12h-1.312c.1.128.21.248.328.36a.75.75 0 0 1 .234.545v.345a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1-.75-.75v-.345a.75.75 0 0 1 .234-.545c.118-.111.228-.232.328-.36H4.25A2.25 2.25 0 0 1 2 9.75v-5.5Zm2.25-.75a.75.75 0 0 0-.75.75v4.5c0 .414.336.75.75.75h7.5a.75.75 0 0 0 .75-.75v-4.5a.75.75 0 0 0-.75-.75h-7.5Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Interface')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'audio'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'audio';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M7.557 2.066A.75.75 0 0 1 8 2.75v10.5a.75.75 0 0 1-1.248.56L3.59 11H2a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h1.59l3.162-2.81a.75.75 0 0 1 .805-.124ZM12.95 3.05a.75.75 0 1 0-1.06 1.06 5.5 5.5 0 0 1 0 7.78.75.75 0 1 0 1.06 1.06 7 7 0 0 0 0-9.9Z"
|
||||
/>
|
||||
<path
|
||||
d="M10.828 5.172a.75.75 0 1 0-1.06 1.06 2.5 2.5 0 0 1 0 3.536.75.75 0 1 0 1.06 1.06 4 4 0 0 0 0-5.656Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Audio')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'images'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'images';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M2 4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4Zm10.5 5.707a.5.5 0 0 0-.146-.353l-1-1a.5.5 0 0 0-.708 0L9.354 9.646a.5.5 0 0 1-.708 0L6.354 7.354a.5.5 0 0 0-.708 0l-2 2a.5.5 0 0 0-.146.353V12a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5V9.707ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Images')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'pipelines'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'pipelines';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
d="M11.644 1.59a.75.75 0 0 1 .712 0l9.75 5.25a.75.75 0 0 1 0 1.32l-9.75 5.25a.75.75 0 0 1-.712 0l-9.75-5.25a.75.75 0 0 1 0-1.32l9.75-5.25Z"
|
||||
/>
|
||||
<path
|
||||
d="m3.265 10.602 7.668 4.129a2.25 2.25 0 0 0 2.134 0l7.668-4.13 1.37.739a.75.75 0 0 1 0 1.32l-9.75 5.25a.75.75 0 0 1-.71 0l-9.75-5.25a.75.75 0 0 1 0-1.32l1.37-.738Z"
|
||||
/>
|
||||
<path
|
||||
d="m10.933 19.231-7.668-4.13-1.37.739a.75.75 0 0 0 0 1.32l9.75 5.25c.221.12.489.12.71 0l9.75-5.25a.75.75 0 0 0 0-1.32l-1.37-.738-7.668 4.13a2.25 2.25 0 0 1-2.134-.001Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Pipelines')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'db'
|
||||
? 'bg-gray-200 dark:bg-gray-800'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-850'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'db';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path d="M8 7c3.314 0 6-1.343 6-3s-2.686-3-6-3-6 1.343-6 3 2.686 3 6 3Z" />
|
||||
<path
|
||||
d="M8 8.5c1.84 0 3.579-.37 4.914-1.037A6.33 6.33 0 0 0 14 6.78V8c0 1.657-2.686 3-6 3S2 9.657 2 8V6.78c.346.273.72.5 1.087.683C4.42 8.131 6.16 8.5 8 8.5Z"
|
||||
/>
|
||||
<path
|
||||
d="M8 12.5c1.84 0 3.579-.37 4.914-1.037.366-.183.74-.41 1.086-.684V12c0 1.657-2.686 3-6 3s-6-1.343-6-3v-1.22c.346.273.72.5 1.087.683C4.42 12.131 6.16 12.5 8 12.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Database')}</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="flex-1 mt-3 lg:mt-0 overflow-y-scroll">
|
||||
{#if selectedTab === 'general'}
|
||||
<General
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'users'}
|
||||
<Users
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'connections'}
|
||||
<Connections
|
||||
on:save={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'models'}
|
||||
<Models />
|
||||
{:else if selectedTab === 'documents'}
|
||||
<Documents
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'web'}
|
||||
<WebSearch
|
||||
saveHandler={async () => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
|
||||
await tick();
|
||||
await config.set(await getBackendConfig());
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'interface'}
|
||||
<Interface
|
||||
on:save={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'audio'}
|
||||
<Audio
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'images'}
|
||||
<Images
|
||||
on:save={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'db'}
|
||||
<Database
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'pipelines'}
|
||||
<Pipelines
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,302 @@
|
||||
<script lang="ts">
|
||||
import { getAudioConfig, updateAudioConfig } from '$lib/apis/audio';
|
||||
import { user, settings, config } from '$lib/stores';
|
||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
import { getBackendConfig } from '$lib/apis';
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let saveHandler: Function;
|
||||
|
||||
// Audio
|
||||
|
||||
let TTS_OPENAI_API_BASE_URL = '';
|
||||
let TTS_OPENAI_API_KEY = '';
|
||||
let TTS_ENGINE = '';
|
||||
let TTS_MODEL = '';
|
||||
let TTS_VOICE = '';
|
||||
|
||||
let STT_OPENAI_API_BASE_URL = '';
|
||||
let STT_OPENAI_API_KEY = '';
|
||||
let STT_ENGINE = '';
|
||||
let STT_MODEL = '';
|
||||
|
||||
let voices = [];
|
||||
let models = [];
|
||||
let nonLocalVoices = false;
|
||||
|
||||
const getOpenAIVoices = () => {
|
||||
voices = [
|
||||
{ name: 'alloy' },
|
||||
{ name: 'echo' },
|
||||
{ name: 'fable' },
|
||||
{ name: 'onyx' },
|
||||
{ name: 'nova' },
|
||||
{ name: 'shimmer' }
|
||||
];
|
||||
};
|
||||
|
||||
const getOpenAIModels = () => {
|
||||
models = [{ name: 'tts-1' }, { name: 'tts-1-hd' }];
|
||||
};
|
||||
|
||||
const getWebAPIVoices = () => {
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
|
||||
// do your loop
|
||||
if (voices.length > 0) {
|
||||
clearInterval(getVoicesLoop);
|
||||
}
|
||||
}, 100);
|
||||
};
|
||||
|
||||
const updateConfigHandler = async () => {
|
||||
const res = await updateAudioConfig(localStorage.token, {
|
||||
tts: {
|
||||
OPENAI_API_BASE_URL: TTS_OPENAI_API_BASE_URL,
|
||||
OPENAI_API_KEY: TTS_OPENAI_API_KEY,
|
||||
ENGINE: TTS_ENGINE,
|
||||
MODEL: TTS_MODEL,
|
||||
VOICE: TTS_VOICE
|
||||
},
|
||||
stt: {
|
||||
OPENAI_API_BASE_URL: STT_OPENAI_API_BASE_URL,
|
||||
OPENAI_API_KEY: STT_OPENAI_API_KEY,
|
||||
ENGINE: STT_ENGINE,
|
||||
MODEL: STT_MODEL
|
||||
}
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success('Audio settings updated successfully');
|
||||
|
||||
config.set(await getBackendConfig());
|
||||
}
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
const res = await getAudioConfig(localStorage.token);
|
||||
|
||||
if (res) {
|
||||
console.log(res);
|
||||
TTS_OPENAI_API_BASE_URL = res.tts.OPENAI_API_BASE_URL;
|
||||
TTS_OPENAI_API_KEY = res.tts.OPENAI_API_KEY;
|
||||
|
||||
TTS_ENGINE = res.tts.ENGINE;
|
||||
TTS_MODEL = res.tts.MODEL;
|
||||
TTS_VOICE = res.tts.VOICE;
|
||||
|
||||
STT_OPENAI_API_BASE_URL = res.stt.OPENAI_API_BASE_URL;
|
||||
STT_OPENAI_API_KEY = res.stt.OPENAI_API_KEY;
|
||||
|
||||
STT_ENGINE = res.stt.ENGINE;
|
||||
STT_MODEL = res.stt.MODEL;
|
||||
}
|
||||
|
||||
if (TTS_ENGINE === 'openai') {
|
||||
getOpenAIVoices();
|
||||
getOpenAIModels();
|
||||
} else {
|
||||
getWebAPIVoices();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={async () => {
|
||||
await updateConfigHandler();
|
||||
dispatch('save');
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 overflow-y-scroll scrollbar-hidden h-full">
|
||||
<div class="flex flex-col gap-3">
|
||||
<div>
|
||||
<div class=" mb-1 text-sm font-medium">{$i18n.t('STT Settings')}</div>
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Speech-to-Text Engine')}</div>
|
||||
<div class="flex items-center relative">
|
||||
<select
|
||||
class="dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={STT_ENGINE}
|
||||
placeholder="Select an engine"
|
||||
>
|
||||
<option value="">{$i18n.t('Whisper (Local)')}</option>
|
||||
<option value="openai">OpenAI</option>
|
||||
<option value="web">{$i18n.t('Web API')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if STT_ENGINE === 'openai'}
|
||||
<div>
|
||||
<div class="mt-1 flex gap-2 mb-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('API Base URL')}
|
||||
bind:value={STT_OPENAI_API_BASE_URL}
|
||||
required
|
||||
/>
|
||||
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={STT_OPENAI_API_KEY}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850 my-2" />
|
||||
|
||||
<div>
|
||||
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('STT Model')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
list="model-list"
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={STT_MODEL}
|
||||
placeholder="Select a model"
|
||||
/>
|
||||
|
||||
<datalist id="model-list">
|
||||
<option value="whisper-1" />
|
||||
</datalist>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-800" />
|
||||
|
||||
<div>
|
||||
<div class=" mb-1 text-sm font-medium">{$i18n.t('TTS Settings')}</div>
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Text-to-Speech Engine')}</div>
|
||||
<div class="flex items-center relative">
|
||||
<select
|
||||
class=" dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={TTS_ENGINE}
|
||||
placeholder="Select a mode"
|
||||
on:change={(e) => {
|
||||
if (e.target.value === 'openai') {
|
||||
getOpenAIVoices();
|
||||
TTS_VOICE = 'alloy';
|
||||
TTS_MODEL = 'tts-1';
|
||||
} else {
|
||||
getWebAPIVoices();
|
||||
TTS_VOICE = '';
|
||||
}
|
||||
}}
|
||||
>
|
||||
<option value="">{$i18n.t('Web API')}</option>
|
||||
<option value="openai">{$i18n.t('Open AI')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if TTS_ENGINE === 'openai'}
|
||||
<div>
|
||||
<div class="mt-1 flex gap-2 mb-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('API Base URL')}
|
||||
bind:value={TTS_OPENAI_API_BASE_URL}
|
||||
required
|
||||
/>
|
||||
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={TTS_OPENAI_API_KEY}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<hr class=" dark:border-gray-850 my-2" />
|
||||
|
||||
{#if TTS_ENGINE === ''}
|
||||
<div>
|
||||
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('TTS Voice')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={TTS_VOICE}
|
||||
>
|
||||
<option value="" selected={TTS_VOICE !== ''}>{$i18n.t('Default')}</option>
|
||||
{#each voices as voice}
|
||||
<option
|
||||
value={voice.voiceURI}
|
||||
class="bg-gray-100 dark:bg-gray-700"
|
||||
selected={TTS_VOICE === voice.voiceURI}>{voice.name}</option
|
||||
>
|
||||
{/each}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if TTS_ENGINE === 'openai'}
|
||||
<div class=" flex gap-2">
|
||||
<div class="w-full">
|
||||
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('TTS Voice')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
list="voice-list"
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={TTS_VOICE}
|
||||
placeholder="Select a voice"
|
||||
/>
|
||||
|
||||
<datalist id="voice-list">
|
||||
{#each voices as voice}
|
||||
<option value={voice.name} />
|
||||
{/each}
|
||||
</datalist>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="w-full">
|
||||
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('TTS Model')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
list="model-list"
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={TTS_MODEL}
|
||||
placeholder="Select a model"
|
||||
/>
|
||||
|
||||
<datalist id="model-list">
|
||||
{#each models as model}
|
||||
<option value={model.name} />
|
||||
{/each}
|
||||
</datalist>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end text-sm font-medium">
|
||||
<button
|
||||
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
|
||||
type="submit"
|
||||
>
|
||||
{$i18n.t('Save')}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
@@ -1,137 +0,0 @@
|
||||
<script lang="ts">
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
import { getContext, onMount } from 'svelte';
|
||||
import { banners as _banners } from '$lib/stores';
|
||||
import type { Banner } from '$lib/types';
|
||||
|
||||
import { getBanners, setBanners } from '$lib/apis/configs';
|
||||
|
||||
import type { Writable } from 'svelte/store';
|
||||
import type { i18n as i18nType } from 'i18next';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
const i18n: Writable<i18nType> = getContext('i18n');
|
||||
|
||||
export let saveHandler: Function;
|
||||
|
||||
let banners: Banner[] = [];
|
||||
|
||||
onMount(async () => {
|
||||
banners = await getBanners(localStorage.token);
|
||||
});
|
||||
|
||||
const updateBanners = async () => {
|
||||
_banners.set(await setBanners(localStorage.token, banners));
|
||||
};
|
||||
</script>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={async () => {
|
||||
updateBanners();
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 pr-1.5 overflow-y-scroll max-h-80 h-full">
|
||||
<div class=" space-y-3 pr-1.5">
|
||||
<div class="flex w-full justify-between mb-2">
|
||||
<div class=" self-center text-sm font-semibold">
|
||||
{$i18n.t('Banners')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
if (banners.length === 0 || banners.at(-1).content !== '') {
|
||||
banners = [
|
||||
...banners,
|
||||
{
|
||||
id: uuidv4(),
|
||||
type: '',
|
||||
title: '',
|
||||
content: '',
|
||||
dismissible: true,
|
||||
timestamp: Math.floor(Date.now() / 1000)
|
||||
}
|
||||
];
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="flex flex-col space-y-1">
|
||||
{#each banners as banner, bannerIdx}
|
||||
<div class=" flex justify-between">
|
||||
<div class="flex flex-row flex-1 border rounded-xl dark:border-gray-800">
|
||||
<select
|
||||
class="w-fit capitalize rounded-xl py-2 px-4 text-xs bg-transparent outline-none"
|
||||
bind:value={banner.type}
|
||||
>
|
||||
{#if banner.type == ''}
|
||||
<option value="" selected disabled class="text-gray-900">{$i18n.t('Type')}</option
|
||||
>
|
||||
{/if}
|
||||
<option value="info" class="text-gray-900">{$i18n.t('Info')}</option>
|
||||
<option value="warning" class="text-gray-900">{$i18n.t('Warning')}</option>
|
||||
<option value="error" class="text-gray-900">{$i18n.t('Error')}</option>
|
||||
<option value="success" class="text-gray-900">{$i18n.t('Success')}</option>
|
||||
</select>
|
||||
|
||||
<input
|
||||
class="pr-5 py-1.5 text-xs w-full bg-transparent outline-none"
|
||||
placeholder={$i18n.t('Content')}
|
||||
bind:value={banner.content}
|
||||
/>
|
||||
|
||||
<div class="relative top-1.5 -left-2">
|
||||
<Tooltip content="Dismissible" className="flex h-fit items-center">
|
||||
<Switch bind:state={banner.dismissible} />
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="px-2"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
banners.splice(bannerIdx, 1);
|
||||
banners = banners;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end pt-3 text-sm font-medium">
|
||||
<button
|
||||
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
|
||||
type="submit"
|
||||
>
|
||||
Save
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
+19
-4
@@ -23,10 +23,14 @@
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import { getModels as _getModels } from '$lib/apis';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let getModels: Function;
|
||||
const getModels = async () => {
|
||||
const models = await _getModels(localStorage.token);
|
||||
return models;
|
||||
};
|
||||
|
||||
// External
|
||||
let OLLAMA_BASE_URLS = [''];
|
||||
@@ -40,6 +44,8 @@
|
||||
let ENABLE_OLLAMA_API = null;
|
||||
|
||||
const verifyOpenAIHandler = async (idx) => {
|
||||
OPENAI_API_BASE_URLS = OPENAI_API_BASE_URLS.map((url) => url.replace(/\/$/, ''));
|
||||
|
||||
OPENAI_API_BASE_URLS = await updateOpenAIUrls(localStorage.token, OPENAI_API_BASE_URLS);
|
||||
OPENAI_API_KEYS = await updateOpenAIKeys(localStorage.token, OPENAI_API_KEYS);
|
||||
|
||||
@@ -59,6 +65,10 @@
|
||||
};
|
||||
|
||||
const verifyOllamaHandler = async (idx) => {
|
||||
OLLAMA_BASE_URLS = OLLAMA_BASE_URLS.filter((url) => url !== '').map((url) =>
|
||||
url.replace(/\/$/, '')
|
||||
);
|
||||
|
||||
OLLAMA_BASE_URLS = await updateOllamaUrls(localStorage.token, OLLAMA_BASE_URLS);
|
||||
|
||||
const res = await getOllamaVersion(localStorage.token, idx).catch((error) => {
|
||||
@@ -74,6 +84,8 @@
|
||||
};
|
||||
|
||||
const updateOpenAIHandler = async () => {
|
||||
OPENAI_API_BASE_URLS = OPENAI_API_BASE_URLS.map((url) => url.replace(/\/$/, ''));
|
||||
|
||||
// Check if API KEYS length is same than API URLS length
|
||||
if (OPENAI_API_KEYS.length !== OPENAI_API_BASE_URLS.length) {
|
||||
// if there are more keys than urls, remove the extra keys
|
||||
@@ -96,7 +108,10 @@
|
||||
};
|
||||
|
||||
const updateOllamaUrlsHandler = async () => {
|
||||
OLLAMA_BASE_URLS = OLLAMA_BASE_URLS.filter((url) => url !== '');
|
||||
OLLAMA_BASE_URLS = OLLAMA_BASE_URLS.filter((url) => url !== '').map((url) =>
|
||||
url.replace(/\/$/, '')
|
||||
);
|
||||
|
||||
console.log(OLLAMA_BASE_URLS);
|
||||
|
||||
if (OLLAMA_BASE_URLS.length === 0) {
|
||||
@@ -158,7 +173,7 @@
|
||||
dispatch('save');
|
||||
}}
|
||||
>
|
||||
<div class="space-y-3 pr-1.5 overflow-y-scroll h-[24rem] max-h-[25rem]">
|
||||
<div class="space-y-3 overflow-y-scroll scrollbar-hidden h-full">
|
||||
{#if ENABLE_OPENAI_API !== null && ENABLE_OLLAMA_API !== null}
|
||||
<div class=" space-y-3">
|
||||
<div class="mt-2 space-y-2 pr-1.5">
|
||||
@@ -300,7 +315,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-700" />
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div class="pr-1.5 space-y-2">
|
||||
<div class="flex justify-between items-center text-sm">
|
||||
@@ -30,7 +30,7 @@
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 pr-1.5 overflow-y-scroll max-h-80">
|
||||
<div class=" space-y-3 overflow-y-scroll scrollbar-hidden h-full">
|
||||
<div>
|
||||
<div class=" mb-2 text-sm font-medium">{$i18n.t('Database')}</div>
|
||||
|
||||
|
||||
+223
-197
@@ -9,8 +9,12 @@
|
||||
updateEmbeddingConfig,
|
||||
getRerankingConfig,
|
||||
updateRerankingConfig,
|
||||
resetUploadDir
|
||||
resetUploadDir,
|
||||
getRAGConfig,
|
||||
updateRAGConfig
|
||||
} from '$lib/apis/rag';
|
||||
import ResetUploadDirConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
|
||||
import ResetVectorDBConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
|
||||
|
||||
import { documents, models } from '$lib/stores';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
@@ -31,6 +35,10 @@
|
||||
let embeddingModel = '';
|
||||
let rerankingModel = '';
|
||||
|
||||
let chunkSize = 0;
|
||||
let chunkOverlap = 0;
|
||||
let pdfExtractImages = true;
|
||||
|
||||
let OpenAIKey = '';
|
||||
let OpenAIUrl = '';
|
||||
let OpenAIBatchSize = 1;
|
||||
@@ -152,6 +160,16 @@
|
||||
if (querySettings.hybrid) {
|
||||
rerankingModelUpdateHandler();
|
||||
}
|
||||
|
||||
const res = await updateRAGConfig(localStorage.token, {
|
||||
pdf_extract_images: pdfExtractImages,
|
||||
chunk: {
|
||||
chunk_overlap: chunkOverlap,
|
||||
chunk_size: chunkSize
|
||||
}
|
||||
});
|
||||
|
||||
await updateQuerySettings(localStorage.token, querySettings);
|
||||
};
|
||||
|
||||
const setEmbeddingConfig = async () => {
|
||||
@@ -185,9 +203,46 @@
|
||||
await setRerankingConfig();
|
||||
|
||||
querySettings = await getQuerySettings(localStorage.token);
|
||||
|
||||
const res = await getRAGConfig(localStorage.token);
|
||||
|
||||
if (res) {
|
||||
pdfExtractImages = res.pdf_extract_images;
|
||||
|
||||
chunkSize = res.chunk.chunk_size;
|
||||
chunkOverlap = res.chunk.chunk_overlap;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<ResetUploadDirConfirmDialog
|
||||
bind:show={showResetUploadDirConfirm}
|
||||
on:confirm={() => {
|
||||
const res = resetUploadDir(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Success'));
|
||||
}
|
||||
}}
|
||||
/>
|
||||
|
||||
<ResetVectorDBConfirmDialog
|
||||
bind:show={showResetConfirm}
|
||||
on:confirm={() => {
|
||||
const res = resetVectorDB(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Success'));
|
||||
}
|
||||
}}
|
||||
/>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={() => {
|
||||
@@ -195,7 +250,7 @@
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-2.5 pr-1.5 overflow-y-scroll max-h-[28rem]">
|
||||
<div class=" space-y-2.5 overflow-y-scroll scrollbar-hidden h-full">
|
||||
<div class="flex flex-col gap-0.5">
|
||||
<div class=" mb-0.5 text-sm font-medium">{$i18n.t('General Settings')}</div>
|
||||
|
||||
@@ -332,7 +387,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-700 my-1" />
|
||||
<hr class=" dark:border-gray-850 my-1" />
|
||||
|
||||
<div class="space-y-2" />
|
||||
<div>
|
||||
@@ -350,10 +405,8 @@
|
||||
{#if !embeddingModel}
|
||||
<option value="" disabled selected>{$i18n.t('Select a model')}</option>
|
||||
{/if}
|
||||
{#each $models.filter((m) => m.id && !m.external) as model}
|
||||
<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
|
||||
>{model.name + ' (' + (model.size / 1024 ** 3).toFixed(1) + ' GB)'}</option
|
||||
>
|
||||
{#each $models.filter((m) => m.id && m.ollama && !(m?.preset ?? false)) as model}
|
||||
<option value={model.id} class="bg-gray-100 dark:bg-gray-700">{model.name}</option>
|
||||
{/each}
|
||||
</select>
|
||||
</div>
|
||||
@@ -500,200 +553,173 @@
|
||||
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div class=" ">
|
||||
<div class=" text-sm font-medium">{$i18n.t('Query Params')}</div>
|
||||
|
||||
<div class=" flex">
|
||||
<div class=" flex w-full justify-between">
|
||||
<div class="self-center text-xs font-medium min-w-fit">{$i18n.t('Top K')}</div>
|
||||
|
||||
<div class="self-center p-3">
|
||||
<input
|
||||
class=" w-full rounded-lg py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="number"
|
||||
placeholder={$i18n.t('Enter Top K')}
|
||||
bind:value={querySettings.k}
|
||||
autocomplete="off"
|
||||
min="0"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if querySettings.hybrid === true}
|
||||
<div class="flex w-full">
|
||||
<div class=" self-center text-xs font-medium min-w-fit">
|
||||
{$i18n.t('Minimum Score')}
|
||||
</div>
|
||||
|
||||
<div class="self-center p-3">
|
||||
<input
|
||||
class=" w-full rounded-lg py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="number"
|
||||
step="0.01"
|
||||
placeholder={$i18n.t('Enter Score')}
|
||||
bind:value={querySettings.r}
|
||||
autocomplete="off"
|
||||
min="0.0"
|
||||
title={$i18n.t('The score should be a value between 0.0 (0%) and 1.0 (100%).')}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
{#if querySettings.hybrid === true}
|
||||
<div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
|
||||
{$i18n.t(
|
||||
'Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.'
|
||||
)}
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850 my-3" />
|
||||
{/if}
|
||||
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('RAG Template')}</div>
|
||||
<textarea
|
||||
bind:value={querySettings.template}
|
||||
class="w-full rounded-lg px-4 py-3 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none resize-none"
|
||||
rows="4"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div class=" ">
|
||||
<div class=" text-sm font-medium">{$i18n.t('Chunk Params')}</div>
|
||||
|
||||
<div class=" my-2 flex gap-1.5">
|
||||
<div class=" w-full justify-between">
|
||||
<div class="self-center text-xs font-medium min-w-fit mb-1">{$i18n.t('Chunk Size')}</div>
|
||||
<div class="self-center">
|
||||
<input
|
||||
class=" w-full rounded-lg py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="number"
|
||||
placeholder={$i18n.t('Enter Chunk Size')}
|
||||
bind:value={chunkSize}
|
||||
autocomplete="off"
|
||||
min="0"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full">
|
||||
<div class=" self-center text-xs font-medium min-w-fit mb-1">
|
||||
{$i18n.t('Chunk Overlap')}
|
||||
</div>
|
||||
|
||||
<div class="self-center">
|
||||
<input
|
||||
class="w-full rounded-lg py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="number"
|
||||
placeholder={$i18n.t('Enter Chunk Overlap')}
|
||||
bind:value={chunkOverlap}
|
||||
autocomplete="off"
|
||||
min="0"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
<div class="flex justify-between items-center text-xs">
|
||||
<div class=" text-xs font-medium">{$i18n.t('PDF Extract Images (OCR)')}</div>
|
||||
|
||||
<button
|
||||
class=" text-xs font-medium text-gray-500"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
pdfExtractImages = !pdfExtractImages;
|
||||
}}>{pdfExtractImages ? $i18n.t('On') : $i18n.t('Off')}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div>
|
||||
{#if showResetUploadDirConfirm}
|
||||
<div class="flex justify-between rounded-md items-center py-2 px-3.5 w-full transition">
|
||||
<div class="flex items-center space-x-3">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5H9a3.75 3.75 0 0 1 3.75 3.75v1.875c0 1.036.84 1.875 1.875 1.875H16.5a3.75 3.75 0 0 1 3.75 3.75v7.875c0 1.035-.84 1.875-1.875 1.875H5.625a1.875 1.875 0 0 1-1.875-1.875V3.375c0-1.036.84-1.875 1.875-1.875ZM9.75 14.25a.75.75 0 0 0 0 1.5H15a.75.75 0 0 0 0-1.5H9.75Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M14.25 5.25a5.23 5.23 0 0 0-1.279-3.434 9.768 9.768 0 0 1 6.963 6.963A5.23 5.23 0 0 0 16.5 7.5h-1.875a.375.375 0 0 1-.375-.375V5.25Z"
|
||||
/>
|
||||
</svg>
|
||||
<span>{$i18n.t('Are you sure?')}</span>
|
||||
</div>
|
||||
|
||||
<div class="flex space-x-1.5 items-center">
|
||||
<button
|
||||
class="hover:text-white transition"
|
||||
on:click={() => {
|
||||
const res = resetUploadDir(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Success'));
|
||||
}
|
||||
|
||||
showResetUploadDirConfirm = false;
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
<button
|
||||
class="hover:text-white transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
showResetUploadDirConfirm = false;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<button
|
||||
class=" flex rounded-xl py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
||||
on:click={() => {
|
||||
showResetUploadDirConfirm = true;
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<div class=" self-center mr-3">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5H9a3.75 3.75 0 0 1 3.75 3.75v1.875c0 1.036.84 1.875 1.875 1.875H16.5a3.75 3.75 0 0 1 3.75 3.75v7.875c0 1.035-.84 1.875-1.875 1.875H5.625a1.875 1.875 0 0 1-1.875-1.875V3.375c0-1.036.84-1.875 1.875-1.875ZM9.75 14.25a.75.75 0 0 0 0 1.5H15a.75.75 0 0 0 0-1.5H9.75Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M14.25 5.25a5.23 5.23 0 0 0-1.279-3.434 9.768 9.768 0 0 1 6.963 6.963A5.23 5.23 0 0 0 16.5 7.5h-1.875a.375.375 0 0 1-.375-.375V5.25Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
{:else}
|
||||
<button
|
||||
class=" flex rounded-xl py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
||||
on:click={() => {
|
||||
showResetUploadDirConfirm = true;
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<div class=" self-center mr-3">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5H9a3.75 3.75 0 0 1 3.75 3.75v1.875c0 1.036.84 1.875 1.875 1.875H16.5a3.75 3.75 0 0 1 3.75 3.75v7.875c0 1.035-.84 1.875-1.875 1.875H5.625a1.875 1.875 0 0 1-1.875-1.875V3.375c0-1.036.84-1.875 1.875-1.875ZM9.75 14.25a.75.75 0 0 0 0 1.5H15a.75.75 0 0 0 0-1.5H9.75Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M14.25 5.25a5.23 5.23 0 0 0-1.279-3.434 9.768 9.768 0 0 1 6.963 6.963A5.23 5.23 0 0 0 16.5 7.5h-1.875a.375.375 0 0 1-.375-.375V5.25Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center text-sm font-medium">{$i18n.t('Reset Upload Directory')}</div>
|
||||
</button>
|
||||
{/if}
|
||||
<div class=" self-center text-sm font-medium">{$i18n.t('Reset Upload Directory')}</div>
|
||||
</button>
|
||||
|
||||
{#if showResetConfirm}
|
||||
<div class="flex justify-between rounded-md items-center py-2 px-3.5 w-full transition">
|
||||
<div class="flex items-center space-x-3">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3.5 2A1.5 1.5 0 0 0 2 3.5v9A1.5 1.5 0 0 0 3.5 14h9a1.5 1.5 0 0 0 1.5-1.5v-7A1.5 1.5 0 0 0 12.5 4H9.621a1.5 1.5 0 0 1-1.06-.44L7.439 2.44A1.5 1.5 0 0 0 6.38 2H3.5Zm6.75 7.75a.75.75 0 0 0 0-1.5h-4.5a.75.75 0 0 0 0 1.5h4.5Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
<span>{$i18n.t('Are you sure?')}</span>
|
||||
</div>
|
||||
|
||||
<div class="flex space-x-1.5 items-center">
|
||||
<button
|
||||
class="hover:text-white transition"
|
||||
on:click={() => {
|
||||
const res = resetVectorDB(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success($i18n.t('Success'));
|
||||
}
|
||||
|
||||
showResetConfirm = false;
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
<button
|
||||
class="hover:text-white transition"
|
||||
on:click={() => {
|
||||
showResetConfirm = false;
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<button
|
||||
class=" flex rounded-xl py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
||||
on:click={() => {
|
||||
showResetConfirm = true;
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<div class=" self-center mr-3">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3.5 2A1.5 1.5 0 0 0 2 3.5v9A1.5 1.5 0 0 0 3.5 14h9a1.5 1.5 0 0 0 1.5-1.5v-7A1.5 1.5 0 0 0 12.5 4H9.621a1.5 1.5 0 0 1-1.06-.44L7.439 2.44A1.5 1.5 0 0 0 6.38 2H3.5Zm6.75 7.75a.75.75 0 0 0 0-1.5h-4.5a.75.75 0 0 0 0 1.5h4.5Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
{:else}
|
||||
<button
|
||||
class=" flex rounded-xl py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
|
||||
on:click={() => {
|
||||
showResetConfirm = true;
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<div class=" self-center mr-3">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3.5 2A1.5 1.5 0 0 0 2 3.5v9A1.5 1.5 0 0 0 3.5 14h9a1.5 1.5 0 0 0 1.5-1.5v-7A1.5 1.5 0 0 0 12.5 4H9.621a1.5 1.5 0 0 1-1.06-.44L7.439 2.44A1.5 1.5 0 0 0 6.38 2H3.5Zm6.75 7.75a.75.75 0 0 0 0-1.5h-4.5a.75.75 0 0 0 0 1.5h4.5Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center text-sm font-medium">{$i18n.t('Reset Vector Storage')}</div>
|
||||
</button>
|
||||
{/if}
|
||||
<div class=" self-center text-sm font-medium">{$i18n.t('Reset Vector Storage')}</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end pt-3 text-sm font-medium">
|
||||
@@ -56,7 +56,7 @@
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 pr-1.5 overflow-y-scroll max-h-[22rem]">
|
||||
<div class=" space-y-3 overflow-y-scroll scrollbar-hidden h-full">
|
||||
{#if adminConfig !== null}
|
||||
<div>
|
||||
<div class=" mb-3 text-sm font-medium">{$i18n.t('General Settings')}</div>
|
||||
|
||||
+3
-5
@@ -23,8 +23,6 @@
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let saveSettings: Function;
|
||||
|
||||
let loading = false;
|
||||
|
||||
let imageGenerationEngine = '';
|
||||
@@ -171,7 +169,7 @@
|
||||
loading = false;
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 pr-1.5 overflow-y-scroll max-h-[24rem]">
|
||||
<div class=" space-y-3 overflow-y-scroll scrollbar-hidden">
|
||||
<div>
|
||||
<div class=" mb-1 text-sm font-medium">{$i18n.t('Image Settings')}</div>
|
||||
|
||||
@@ -228,7 +226,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class=" dark:border-gray-700" />
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
{#if imageGenerationEngine === ''}
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('AUTOMATIC1111 Base URL')}</div>
|
||||
@@ -326,7 +324,7 @@
|
||||
{/if}
|
||||
|
||||
{#if enableImageGeneration}
|
||||
<hr class=" dark:border-gray-700" />
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Default Model')}</div>
|
||||
@@ -0,0 +1,339 @@
|
||||
<script lang="ts">
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
import { getBackendConfig, getTaskConfig, updateTaskConfig } from '$lib/apis';
|
||||
import { setDefaultPromptSuggestions } from '$lib/apis/configs';
|
||||
import { config, models, settings, user } from '$lib/stores';
|
||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||
|
||||
import { banners as _banners } from '$lib/stores';
|
||||
import type { Banner } from '$lib/types';
|
||||
|
||||
import { getBanners, setBanners } from '$lib/apis/configs';
|
||||
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let taskConfig = {
|
||||
TASK_MODEL: '',
|
||||
TASK_MODEL_EXTERNAL: '',
|
||||
TITLE_GENERATION_PROMPT_TEMPLATE: '',
|
||||
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE: '',
|
||||
SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD: 0
|
||||
};
|
||||
|
||||
let promptSuggestions = [];
|
||||
let banners: Banner[] = [];
|
||||
|
||||
const updateInterfaceHandler = async () => {
|
||||
taskConfig = await updateTaskConfig(localStorage.token, taskConfig);
|
||||
|
||||
promptSuggestions = await setDefaultPromptSuggestions(localStorage.token, promptSuggestions);
|
||||
await updateBanners();
|
||||
|
||||
await config.set(await getBackendConfig());
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
taskConfig = await getTaskConfig(localStorage.token);
|
||||
|
||||
promptSuggestions = $config?.default_prompt_suggestions;
|
||||
|
||||
banners = await getBanners(localStorage.token);
|
||||
});
|
||||
|
||||
const updateBanners = async () => {
|
||||
_banners.set(await setBanners(localStorage.token, banners));
|
||||
};
|
||||
</script>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={() => {
|
||||
updateInterfaceHandler();
|
||||
dispatch('save');
|
||||
}}
|
||||
>
|
||||
<div class=" overflow-y-scroll scrollbar-hidden h-full pr-1.5">
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium flex">
|
||||
<div class=" mr-1">{$i18n.t('Set Task Model')}</div>
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'A task model is used when performing tasks such as generating titles for chats and web search queries'
|
||||
)}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-5 h-5"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z"
|
||||
/>
|
||||
</svg>
|
||||
</Tooltip>
|
||||
</div>
|
||||
<div class="flex w-full gap-2">
|
||||
<div class="flex-1">
|
||||
<div class=" text-xs mb-1">{$i18n.t('Local Models')}</div>
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={taskConfig.TASK_MODEL}
|
||||
placeholder={$i18n.t('Select a model')}
|
||||
>
|
||||
<option value="" selected>{$i18n.t('Current Model')}</option>
|
||||
{#each $models.filter((m) => m.owned_by === 'ollama') as model}
|
||||
<option value={model.id} class="bg-gray-100 dark:bg-gray-700">
|
||||
{model.name}
|
||||
</option>
|
||||
{/each}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="flex-1">
|
||||
<div class=" text-xs mb-1">{$i18n.t('External Models')}</div>
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={taskConfig.TASK_MODEL_EXTERNAL}
|
||||
placeholder={$i18n.t('Select a model')}
|
||||
>
|
||||
<option value="" selected>{$i18n.t('Current Model')}</option>
|
||||
{#each $models as model}
|
||||
<option value={model.id} class="bg-gray-100 dark:bg-gray-700">
|
||||
{model.name}
|
||||
</option>
|
||||
{/each}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-3">
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Title Generation Prompt')}</div>
|
||||
<textarea
|
||||
bind:value={taskConfig.TITLE_GENERATION_PROMPT_TEMPLATE}
|
||||
class="w-full rounded-lg py-3 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none resize-none"
|
||||
rows="6"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="mt-3">
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Search Query Generation Prompt')}</div>
|
||||
<textarea
|
||||
bind:value={taskConfig.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE}
|
||||
class="w-full rounded-lg py-3 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none resize-none"
|
||||
rows="6"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="mt-3">
|
||||
<div class=" mb-2.5 text-sm font-medium">
|
||||
{$i18n.t('Search Query Generation Prompt Length Threshold')}
|
||||
</div>
|
||||
<input
|
||||
bind:value={taskConfig.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD}
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none resize-none"
|
||||
type="number"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850 my-3" />
|
||||
|
||||
<div class=" space-y-3 {banners.length > 0 ? ' mb-3' : ''}">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-sm font-semibold">
|
||||
{$i18n.t('Banners')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
if (banners.length === 0 || banners.at(-1).content !== '') {
|
||||
banners = [
|
||||
...banners,
|
||||
{
|
||||
id: uuidv4(),
|
||||
type: '',
|
||||
title: '',
|
||||
content: '',
|
||||
dismissible: true,
|
||||
timestamp: Math.floor(Date.now() / 1000)
|
||||
}
|
||||
];
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="flex flex-col space-y-1">
|
||||
{#each banners as banner, bannerIdx}
|
||||
<div class=" flex justify-between">
|
||||
<div class="flex flex-row flex-1 border rounded-xl dark:border-gray-800">
|
||||
<select
|
||||
class="w-fit capitalize rounded-xl py-2 px-4 text-xs bg-transparent outline-none"
|
||||
bind:value={banner.type}
|
||||
required
|
||||
>
|
||||
{#if banner.type == ''}
|
||||
<option value="" selected disabled class="text-gray-900">{$i18n.t('Type')}</option
|
||||
>
|
||||
{/if}
|
||||
<option value="info" class="text-gray-900">{$i18n.t('Info')}</option>
|
||||
<option value="warning" class="text-gray-900">{$i18n.t('Warning')}</option>
|
||||
<option value="error" class="text-gray-900">{$i18n.t('Error')}</option>
|
||||
<option value="success" class="text-gray-900">{$i18n.t('Success')}</option>
|
||||
</select>
|
||||
|
||||
<input
|
||||
class="pr-5 py-1.5 text-xs w-full bg-transparent outline-none"
|
||||
placeholder={$i18n.t('Content')}
|
||||
bind:value={banner.content}
|
||||
/>
|
||||
|
||||
<div class="relative top-1.5 -left-2">
|
||||
<Tooltip content={$i18n.t('Dismissible')} className="flex h-fit items-center">
|
||||
<Switch bind:state={banner.dismissible} />
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="px-2"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
banners.splice(bannerIdx, 1);
|
||||
banners = banners;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if $user.role === 'admin'}
|
||||
<div class=" space-y-3">
|
||||
<div class="flex w-full justify-between mb-2">
|
||||
<div class=" self-center text-sm font-semibold">
|
||||
{$i18n.t('Default Prompt Suggestions')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
if (promptSuggestions.length === 0 || promptSuggestions.at(-1).content !== '') {
|
||||
promptSuggestions = [...promptSuggestions, { content: '', title: ['', ''] }];
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="grid lg:grid-cols-2 flex-col gap-1.5">
|
||||
{#each promptSuggestions as prompt, promptIdx}
|
||||
<div class=" flex dark:bg-gray-850 rounded-xl py-1.5">
|
||||
<div class="flex flex-col flex-1 pl-1">
|
||||
<div class="flex border-b dark:border-gray-800 w-full">
|
||||
<input
|
||||
class="px-3 py-1.5 text-xs w-full bg-transparent outline-none border-r dark:border-gray-800"
|
||||
placeholder={$i18n.t('Title (e.g. Tell me a fun fact)')}
|
||||
bind:value={prompt.title[0]}
|
||||
/>
|
||||
|
||||
<input
|
||||
class="px-3 py-1.5 text-xs w-full bg-transparent outline-none border-r dark:border-gray-800"
|
||||
placeholder={$i18n.t('Subtitle (e.g. about the Roman Empire)')}
|
||||
bind:value={prompt.title[1]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<input
|
||||
class="px-3 py-1.5 text-xs w-full bg-transparent outline-none border-r dark:border-gray-800"
|
||||
placeholder={$i18n.t('Prompt (e.g. Tell me a fun fact about the Roman Empire)')}
|
||||
bind:value={prompt.content}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="px-3"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
promptSuggestions.splice(promptIdx, 1);
|
||||
promptSuggestions = promptSuggestions;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
{#if promptSuggestions.length > 0}
|
||||
<div class="text-xs text-left w-full mt-2">
|
||||
{$i18n.t('Adjusting these settings will apply changes universally to all users.')}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end text-sm font-medium">
|
||||
<button
|
||||
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
|
||||
type="submit"
|
||||
>
|
||||
{$i18n.t('Save')}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -14,7 +14,8 @@
|
||||
getModels,
|
||||
getPipelinesList,
|
||||
downloadPipeline,
|
||||
deletePipeline
|
||||
deletePipeline,
|
||||
uploadPipeline
|
||||
} from '$lib/apis';
|
||||
|
||||
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||
@@ -24,6 +25,9 @@
|
||||
export let saveHandler: Function;
|
||||
|
||||
let downloading = false;
|
||||
let uploading = false;
|
||||
|
||||
let pipelineFiles;
|
||||
|
||||
let PIPELINES_LIST = null;
|
||||
let selectedPipelinesUrlIdx = '';
|
||||
@@ -126,6 +130,41 @@
|
||||
downloading = false;
|
||||
};
|
||||
|
||||
const uploadPipelineHandler = async () => {
|
||||
uploading = true;
|
||||
|
||||
if (pipelineFiles && pipelineFiles.length !== 0) {
|
||||
const file = pipelineFiles[0];
|
||||
|
||||
console.log(file);
|
||||
|
||||
const res = await uploadPipeline(localStorage.token, file, selectedPipelinesUrlIdx).catch(
|
||||
(error) => {
|
||||
console.log(error);
|
||||
toast.error('Something went wrong :/');
|
||||
return null;
|
||||
}
|
||||
);
|
||||
|
||||
if (res) {
|
||||
toast.success('Pipeline downloaded successfully');
|
||||
setPipelines();
|
||||
models.set(await getModels(localStorage.token));
|
||||
}
|
||||
} else {
|
||||
toast.error('No file selected');
|
||||
}
|
||||
|
||||
pipelineFiles = null;
|
||||
const pipelineUploadInputElement = document.getElementById('pipeline-upload-input');
|
||||
|
||||
if (pipelineUploadInputElement) {
|
||||
pipelineUploadInputElement.value = null;
|
||||
}
|
||||
|
||||
uploading = false;
|
||||
};
|
||||
|
||||
const deletePipelineHandler = async () => {
|
||||
const res = await deletePipeline(
|
||||
localStorage.token,
|
||||
@@ -161,7 +200,7 @@
|
||||
updateHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" pr-1.5 overflow-y-scroll max-h-80 h-full">
|
||||
<div class="overflow-y-scroll scrollbar-hidden h-full">
|
||||
{#if PIPELINES_LIST !== null}
|
||||
<div class="flex w-full justify-between mb-2">
|
||||
<div class=" self-center text-sm font-semibold">
|
||||
@@ -196,6 +235,91 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" my-2">
|
||||
<div class=" mb-2 text-sm font-medium">
|
||||
{$i18n.t('Upload Pipeline')}
|
||||
</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1 mr-2">
|
||||
<input
|
||||
id="pipelines-upload-input"
|
||||
bind:files={pipelineFiles}
|
||||
type="file"
|
||||
accept=".py"
|
||||
hidden
|
||||
/>
|
||||
|
||||
<button
|
||||
class="w-full text-sm font-medium py-2 bg-transparent hover:bg-gray-100 border border-dashed dark:border-gray-800 dark:hover:bg-gray-850 text-center rounded-xl"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
document.getElementById('pipelines-upload-input')?.click();
|
||||
}}
|
||||
>
|
||||
{#if pipelineFiles}
|
||||
{pipelineFiles.length > 0 ? `${pipelineFiles.length}` : ''} pipeline(s) selected.
|
||||
{:else}
|
||||
{$i18n.t('Click here to select a py file.')}
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
<button
|
||||
class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
|
||||
on:click={() => {
|
||||
uploadPipelineHandler();
|
||||
}}
|
||||
disabled={uploading}
|
||||
type="button"
|
||||
>
|
||||
{#if uploading}
|
||||
<div class="self-center">
|
||||
<svg
|
||||
class=" w-4 h-4"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<style>
|
||||
.spinner_ajPY {
|
||||
transform-origin: center;
|
||||
animation: spinner_AtaB 0.75s infinite linear;
|
||||
}
|
||||
|
||||
@keyframes spinner_AtaB {
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<path
|
||||
d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
|
||||
opacity=".25"
|
||||
/>
|
||||
<path
|
||||
d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
|
||||
class="spinner_ajPY"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
{:else}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
d="M7.25 10.25a.75.75 0 0 0 1.5 0V4.56l2.22 2.22a.75.75 0 1 0 1.06-1.06l-3.5-3.5a.75.75 0 0 0-1.06 0l-3.5 3.5a.75.75 0 0 0 1.06 1.06l2.22-2.22v5.69Z"
|
||||
/>
|
||||
<path
|
||||
d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
|
||||
/>
|
||||
</svg>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" my-2">
|
||||
<div class=" mb-2 text-sm font-medium">
|
||||
{$i18n.t('Install from Github URL')}
|
||||
@@ -384,6 +508,8 @@
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{:else}
|
||||
<div>Pipelines Not Detected</div>
|
||||
{/if}
|
||||
{:else}
|
||||
<div class="flex justify-center h-full">
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
await config.set(await getBackendConfig());
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 pr-1.5 overflow-y-scroll max-h-80">
|
||||
<div class=" space-y-3 overflow-y-scroll max-h-full">
|
||||
<div>
|
||||
<div class=" mb-2 text-sm font-medium">{$i18n.t('User Permissions')}</div>
|
||||
|
||||
@@ -58,11 +58,11 @@
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
on:click={() => {
|
||||
permissions.chat.deletion = !permissions.chat.deletion;
|
||||
permissions.chat.deletion = !(permissions?.chat?.deletion ?? true);
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{#if permissions.chat.deletion}
|
||||
{#if permissions?.chat?.deletion ?? true}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
@@ -94,7 +94,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-700 my-2" />
|
||||
<hr class=" dark:border-gray-850 my-2" />
|
||||
|
||||
<div class="mt-2 space-y-3">
|
||||
<div>
|
||||
|
||||
@@ -0,0 +1,330 @@
|
||||
<script lang="ts">
|
||||
import { getRAGConfig, updateRAGConfig } from '$lib/apis/rag';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
|
||||
import { documents, models } from '$lib/stores';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let saveHandler: Function;
|
||||
|
||||
let webConfig = null;
|
||||
let webSearchEngines = [
|
||||
'searxng',
|
||||
'google_pse',
|
||||
'brave',
|
||||
'serpstack',
|
||||
'serper',
|
||||
'serply',
|
||||
'duckduckgo',
|
||||
'tavily'
|
||||
];
|
||||
|
||||
let youtubeLanguage = 'en';
|
||||
let youtubeTranslation = null;
|
||||
|
||||
const submitHandler = async () => {
|
||||
const res = await updateRAGConfig(localStorage.token, {
|
||||
web: webConfig,
|
||||
youtube: {
|
||||
language: youtubeLanguage.split(',').map((lang) => lang.trim()),
|
||||
translation: youtubeTranslation
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
const res = await getRAGConfig(localStorage.token);
|
||||
|
||||
if (res) {
|
||||
webConfig = res.web;
|
||||
|
||||
youtubeLanguage = res.youtube.language.join(',');
|
||||
youtubeTranslation = res.youtube.translation;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={async () => {
|
||||
await submitHandler();
|
||||
saveHandler();
|
||||
}}
|
||||
>
|
||||
<div class=" space-y-3 overflow-y-scroll scrollbar-hidden h-full">
|
||||
{#if webConfig}
|
||||
<div>
|
||||
<div class=" mb-1 text-sm font-medium">
|
||||
{$i18n.t('Web Search')}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Enable Web Search')}
|
||||
</div>
|
||||
|
||||
<Switch bind:state={webConfig.search.enabled} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Web Search Engine')}</div>
|
||||
<div class="flex items-center relative">
|
||||
<select
|
||||
class="dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={webConfig.search.engine}
|
||||
placeholder={$i18n.t('Select a engine')}
|
||||
required
|
||||
>
|
||||
<option disabled selected value="">{$i18n.t('Select a engine')}</option>
|
||||
{#each webSearchEngines as engine}
|
||||
<option value={engine}>{engine}</option>
|
||||
{/each}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if webConfig.search.engine !== ''}
|
||||
<div class="mt-1.5">
|
||||
{#if webConfig.search.engine === 'searxng'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Searxng Query URL')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Searxng Query URL')}
|
||||
bind:value={webConfig.search.searxng_query_url}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'google_pse'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Google PSE API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Google PSE API Key')}
|
||||
bind:value={webConfig.search.google_pse_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-1.5">
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Google PSE Engine Id')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Google PSE Engine Id')}
|
||||
bind:value={webConfig.search.google_pse_engine_id}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'brave'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Brave Search API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Brave Search API Key')}
|
||||
bind:value={webConfig.search.brave_search_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'serpstack'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Serpstack API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Serpstack API Key')}
|
||||
bind:value={webConfig.search.serpstack_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'serper'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Serper API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Serper API Key')}
|
||||
bind:value={webConfig.search.serper_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'serply'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Serply API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Serply API Key')}
|
||||
bind:value={webConfig.search.serply_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'tavily'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Tavily API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Tavily API Key')}
|
||||
bind:value={webConfig.search.tavily_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if webConfig.search.enabled}
|
||||
<div class="mt-2 flex gap-2 mb-1">
|
||||
<div class="w-full">
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Search Result Count')}
|
||||
</div>
|
||||
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('Search Result Count')}
|
||||
bind:value={webConfig.search.result_count}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="w-full">
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Concurrent Requests')}
|
||||
</div>
|
||||
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('Concurrent Requests')}
|
||||
bind:value={webConfig.search.concurrent_requests}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850 my-2" />
|
||||
|
||||
<div>
|
||||
<div class=" mb-1 text-sm font-medium">
|
||||
{$i18n.t('Web Loader Settings')}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Bypass SSL verification for Websites')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
on:click={() => {
|
||||
webConfig.ssl_verification = !webConfig.ssl_verification;
|
||||
submitHandler();
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{#if webConfig.ssl_verification === 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 class=" mt-2 mb-1 text-sm font-medium">
|
||||
{$i18n.t('Youtube Loader Settings')}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" w-20 text-xs font-medium self-center">{$i18n.t('Language')}</div>
|
||||
<div class=" flex-1 self-center">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter language codes')}
|
||||
bind:value={youtubeLanguage}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="flex justify-end pt-3 text-sm font-medium">
|
||||
<button
|
||||
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
|
||||
type="submit"
|
||||
>
|
||||
{$i18n.t('Save')}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
@@ -39,181 +39,5 @@
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col md:flex-row w-full p-4 md:space-x-4">
|
||||
<div
|
||||
class="tabs flex flex-row overflow-x-auto space-x-1 md:space-x-0 md:space-y-1 md:flex-col flex-1 md:flex-none md:w-40 dark:text-gray-200 text-xs text-left mb-3 md:mb-0"
|
||||
>
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'general'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'general';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M6.955 1.45A.5.5 0 0 1 7.452 1h1.096a.5.5 0 0 1 .497.45l.17 1.699c.484.12.94.312 1.356.562l1.321-1.081a.5.5 0 0 1 .67.033l.774.775a.5.5 0 0 1 .034.67l-1.08 1.32c.25.417.44.873.561 1.357l1.699.17a.5.5 0 0 1 .45.497v1.096a.5.5 0 0 1-.45.497l-1.699.17c-.12.484-.312.94-.562 1.356l1.082 1.322a.5.5 0 0 1-.034.67l-.774.774a.5.5 0 0 1-.67.033l-1.322-1.08c-.416.25-.872.44-1.356.561l-.17 1.699a.5.5 0 0 1-.497.45H7.452a.5.5 0 0 1-.497-.45l-.17-1.699a4.973 4.973 0 0 1-1.356-.562L4.108 13.37a.5.5 0 0 1-.67-.033l-.774-.775a.5.5 0 0 1-.034-.67l1.08-1.32a4.971 4.971 0 0 1-.561-1.357l-1.699-.17A.5.5 0 0 1 1 8.548V7.452a.5.5 0 0 1 .45-.497l1.699-.17c.12-.484.312-.94.562-1.356L2.629 4.107a.5.5 0 0 1 .034-.67l.774-.774a.5.5 0 0 1 .67-.033L5.43 3.71a4.97 4.97 0 0 1 1.356-.561l.17-1.699ZM6 8c0 .538.212 1.026.558 1.385l.057.057a2 2 0 0 0 2.828-2.828l-.058-.056A2 2 0 0 0 6 8Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('General')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'users'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'users';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M8 8a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5ZM3.156 11.763c.16-.629.44-1.21.813-1.72a2.5 2.5 0 0 0-2.725 1.377c-.136.287.102.58.418.58h1.449c.01-.077.025-.156.045-.237ZM12.847 11.763c.02.08.036.16.046.237h1.446c.316 0 .554-.293.417-.579a2.5 2.5 0 0 0-2.722-1.378c.374.51.653 1.09.813 1.72ZM14 7.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0ZM3.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM5 13c-.552 0-1.013-.455-.876-.99a4.002 4.002 0 0 1 7.753 0c.136.535-.324.99-.877.99H5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Users')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'db'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'db';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path d="M8 7c3.314 0 6-1.343 6-3s-2.686-3-6-3-6 1.343-6 3 2.686 3 6 3Z" />
|
||||
<path
|
||||
d="M8 8.5c1.84 0 3.579-.37 4.914-1.037A6.33 6.33 0 0 0 14 6.78V8c0 1.657-2.686 3-6 3S2 9.657 2 8V6.78c.346.273.72.5 1.087.683C4.42 8.131 6.16 8.5 8 8.5Z"
|
||||
/>
|
||||
<path
|
||||
d="M8 12.5c1.84 0 3.579-.37 4.914-1.037.366-.183.74-.41 1.086-.684V12c0 1.657-2.686 3-6 3s-6-1.343-6-3v-1.22c.346.273.72.5 1.087.683C4.42 12.131 6.16 12.5 8 12.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Database')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'banners'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'banners';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
d="M5.85 3.5a.75.75 0 0 0-1.117-1 9.719 9.719 0 0 0-2.348 4.876.75.75 0 0 0 1.479.248A8.219 8.219 0 0 1 5.85 3.5ZM19.267 2.5a.75.75 0 1 0-1.118 1 8.22 8.22 0 0 1 1.987 4.124.75.75 0 0 0 1.48-.248A9.72 9.72 0 0 0 19.266 2.5Z"
|
||||
/>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M12 2.25A6.75 6.75 0 0 0 5.25 9v.75a8.217 8.217 0 0 1-2.119 5.52.75.75 0 0 0 .298 1.206c1.544.57 3.16.99 4.831 1.243a3.75 3.75 0 1 0 7.48 0 24.583 24.583 0 0 0 4.83-1.244.75.75 0 0 0 .298-1.205 8.217 8.217 0 0 1-2.118-5.52V9A6.75 6.75 0 0 0 12 2.25ZM9.75 18c0-.034 0-.067.002-.1a25.05 25.05 0 0 0 4.496 0l.002.1a2.25 2.25 0 1 1-4.5 0Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Banners')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'pipelines'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'pipelines';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
d="M11.644 1.59a.75.75 0 0 1 .712 0l9.75 5.25a.75.75 0 0 1 0 1.32l-9.75 5.25a.75.75 0 0 1-.712 0l-9.75-5.25a.75.75 0 0 1 0-1.32l9.75-5.25Z"
|
||||
/>
|
||||
<path
|
||||
d="m3.265 10.602 7.668 4.129a2.25 2.25 0 0 0 2.134 0l7.668-4.13 1.37.739a.75.75 0 0 1 0 1.32l-9.75 5.25a.75.75 0 0 1-.71 0l-9.75-5.25a.75.75 0 0 1 0-1.32l1.37-.738Z"
|
||||
/>
|
||||
<path
|
||||
d="m10.933 19.231-7.668-4.13-1.37.739a.75.75 0 0 0 0 1.32l9.75 5.25c.221.12.489.12.71 0l9.75-5.25a.75.75 0 0 0 0-1.32l-1.37-.738-7.668 4.13a2.25 2.25 0 0 1-2.134-.001Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Pipelines')}</div>
|
||||
</button>
|
||||
</div>
|
||||
<div class="flex-1 md:min-h-[380px]">
|
||||
{#if selectedTab === 'general'}
|
||||
<General
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'users'}
|
||||
<Users
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'db'}
|
||||
<Database
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'banners'}
|
||||
<Banners
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'pipelines'}
|
||||
<Pipelines
|
||||
saveHandler={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Modal>
|
||||
|
||||
+384
-266
@@ -7,6 +7,10 @@
|
||||
import { goto } from '$app/navigation';
|
||||
import { page } from '$app/stores';
|
||||
|
||||
import type { Writable } from 'svelte/store';
|
||||
import type { i18n as i18nType } from 'i18next';
|
||||
import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
||||
|
||||
import {
|
||||
chatId,
|
||||
chats,
|
||||
@@ -19,11 +23,14 @@
|
||||
WEBUI_NAME,
|
||||
banners,
|
||||
user,
|
||||
socket
|
||||
socket,
|
||||
showCallOverlay,
|
||||
tools
|
||||
} from '$lib/stores';
|
||||
import {
|
||||
convertMessagesToHistory,
|
||||
copyToClipboard,
|
||||
extractSentencesForAudio,
|
||||
promptTemplate,
|
||||
splitStream
|
||||
} from '$lib/utils';
|
||||
@@ -39,30 +46,27 @@
|
||||
getTagsById,
|
||||
updateChatById
|
||||
} from '$lib/apis/chats';
|
||||
import {
|
||||
generateOpenAIChatCompletion,
|
||||
generateSearchQuery,
|
||||
generateTitle
|
||||
} from '$lib/apis/openai';
|
||||
import { generateOpenAIChatCompletion } from '$lib/apis/openai';
|
||||
import { runWebSearch } from '$lib/apis/rag';
|
||||
import { createOpenAITextStream } from '$lib/apis/streaming';
|
||||
import { queryMemory } from '$lib/apis/memories';
|
||||
import { getUserSettings } from '$lib/apis/users';
|
||||
import { chatCompleted, generateTitle, generateSearchQuery } from '$lib/apis';
|
||||
|
||||
import Banner from '../common/Banner.svelte';
|
||||
import MessageInput from '$lib/components/chat/MessageInput.svelte';
|
||||
import Messages from '$lib/components/chat/Messages.svelte';
|
||||
import Navbar from '$lib/components/layout/Navbar.svelte';
|
||||
import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
||||
import { createOpenAITextStream } from '$lib/apis/streaming';
|
||||
import { queryMemory } from '$lib/apis/memories';
|
||||
import type { Writable } from 'svelte/store';
|
||||
import type { i18n as i18nType } from 'i18next';
|
||||
import { runWebSearch } from '$lib/apis/rag';
|
||||
import Banner from '../common/Banner.svelte';
|
||||
import { getUserSettings } from '$lib/apis/users';
|
||||
import { chatCompleted } from '$lib/apis';
|
||||
import CallOverlay from './MessageInput/CallOverlay.svelte';
|
||||
import { error } from '@sveltejs/kit';
|
||||
|
||||
const i18n: Writable<i18nType> = getContext('i18n');
|
||||
|
||||
export let chatIdProp = '';
|
||||
let loaded = false;
|
||||
|
||||
const eventTarget = new EventTarget();
|
||||
|
||||
let stopResponseFlag = false;
|
||||
let autoScroll = true;
|
||||
let processing = '';
|
||||
@@ -73,6 +77,10 @@
|
||||
let selectedModels = [''];
|
||||
let atSelectedModel: Model | undefined;
|
||||
|
||||
let selectedModelIds = [];
|
||||
$: selectedModelIds = atSelectedModel !== undefined ? [atSelectedModel.id] : selectedModels;
|
||||
|
||||
let selectedToolIds = [];
|
||||
let webSearchEnabled = false;
|
||||
|
||||
let chat = null;
|
||||
@@ -103,7 +111,8 @@
|
||||
|
||||
$: if (chatIdProp) {
|
||||
(async () => {
|
||||
if (await loadChat()) {
|
||||
console.log(chatIdProp);
|
||||
if (chatIdProp && (await loadChat())) {
|
||||
await tick();
|
||||
loaded = true;
|
||||
|
||||
@@ -118,7 +127,11 @@
|
||||
|
||||
onMount(async () => {
|
||||
if (!$chatId) {
|
||||
await initNewChat();
|
||||
chatId.subscribe(async (value) => {
|
||||
if (!value) {
|
||||
await initNewChat();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if (!($settings.saveChatHistory ?? true)) {
|
||||
await goto('/');
|
||||
@@ -292,10 +305,11 @@
|
||||
};
|
||||
|
||||
//////////////////////////
|
||||
// Ollama functions
|
||||
// Chat functions
|
||||
//////////////////////////
|
||||
|
||||
const submitPrompt = async (userPrompt, _user = null) => {
|
||||
const submitPrompt = async (userPrompt, { _raw = false } = {}) => {
|
||||
let _responses = [];
|
||||
console.log('submitPrompt', $chatId);
|
||||
|
||||
selectedModels = selectedModels.map((modelId) =>
|
||||
@@ -318,8 +332,18 @@
|
||||
)
|
||||
);
|
||||
} else {
|
||||
// Reset chat message textarea height
|
||||
document.getElementById('chat-textarea').style.height = '';
|
||||
// Reset chat input textarea
|
||||
const chatTextAreaElement = document.getElementById('chat-textarea');
|
||||
|
||||
if (chatTextAreaElement) {
|
||||
chatTextAreaElement.value = '';
|
||||
chatTextAreaElement.style.height = '';
|
||||
}
|
||||
|
||||
const _files = JSON.parse(JSON.stringify(files));
|
||||
files = [];
|
||||
|
||||
prompt = '';
|
||||
|
||||
// Create user message
|
||||
let userMessageId = uuidv4();
|
||||
@@ -328,9 +352,8 @@
|
||||
parentId: messages.length !== 0 ? messages.at(-1).id : null,
|
||||
childrenIds: [],
|
||||
role: 'user',
|
||||
user: _user ?? undefined,
|
||||
content: userPrompt,
|
||||
files: files.length > 0 ? files : undefined,
|
||||
files: _files.length > 0 ? _files : undefined,
|
||||
timestamp: Math.floor(Date.now() / 1000), // Unix epoch
|
||||
models: selectedModels.filter((m, mIdx) => selectedModels.indexOf(m) === mIdx)
|
||||
};
|
||||
@@ -346,51 +369,86 @@
|
||||
|
||||
// Wait until history/message have been updated
|
||||
await tick();
|
||||
|
||||
// Create new chat if only one message in messages
|
||||
if (messages.length == 1) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
chat = await createNewChat(localStorage.token, {
|
||||
id: $chatId,
|
||||
title: $i18n.t('New Chat'),
|
||||
models: selectedModels,
|
||||
system: $settings.system ?? undefined,
|
||||
options: {
|
||||
...($settings.params ?? {})
|
||||
},
|
||||
messages: messages,
|
||||
history: history,
|
||||
tags: [],
|
||||
timestamp: Date.now()
|
||||
});
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
await chatId.set(chat.id);
|
||||
} else {
|
||||
await chatId.set('local');
|
||||
}
|
||||
await tick();
|
||||
}
|
||||
|
||||
// Reset chat input textarea
|
||||
prompt = '';
|
||||
document.getElementById('chat-textarea').style.height = '';
|
||||
files = [];
|
||||
|
||||
// Send prompt
|
||||
await sendPrompt(userPrompt, userMessageId);
|
||||
_responses = await sendPrompt(userPrompt, userMessageId, { newChat: true });
|
||||
}
|
||||
|
||||
return _responses;
|
||||
};
|
||||
|
||||
const sendPrompt = async (prompt, parentId, modelId = null) => {
|
||||
const sendPrompt = async (prompt, parentId, { modelId = null, newChat = false } = {}) => {
|
||||
let _responses = [];
|
||||
|
||||
// If modelId is provided, use it, else use selected model
|
||||
let selectedModelIds = modelId
|
||||
? [modelId]
|
||||
: atSelectedModel !== undefined
|
||||
? [atSelectedModel.id]
|
||||
: selectedModels;
|
||||
|
||||
// Create response messages for each selected model
|
||||
const responseMessageIds = {};
|
||||
for (const modelId of selectedModelIds) {
|
||||
const model = $models.filter((m) => m.id === modelId).at(0);
|
||||
|
||||
if (model) {
|
||||
let responseMessageId = uuidv4();
|
||||
let responseMessage = {
|
||||
parentId: parentId,
|
||||
id: responseMessageId,
|
||||
childrenIds: [],
|
||||
role: 'assistant',
|
||||
content: '',
|
||||
model: model.id,
|
||||
modelName: model.name ?? model.id,
|
||||
userContext: null,
|
||||
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
|
||||
};
|
||||
|
||||
// Add message to history and Set currentId to messageId
|
||||
history.messages[responseMessageId] = responseMessage;
|
||||
history.currentId = responseMessageId;
|
||||
|
||||
// Append messageId to childrenIds of parent message
|
||||
if (parentId !== null) {
|
||||
history.messages[parentId].childrenIds = [
|
||||
...history.messages[parentId].childrenIds,
|
||||
responseMessageId
|
||||
];
|
||||
}
|
||||
|
||||
responseMessageIds[modelId] = responseMessageId;
|
||||
}
|
||||
}
|
||||
await tick();
|
||||
|
||||
// Create new chat if only one message in messages
|
||||
if (newChat && messages.length == 2) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
chat = await createNewChat(localStorage.token, {
|
||||
id: $chatId,
|
||||
title: $i18n.t('New Chat'),
|
||||
models: selectedModels,
|
||||
system: $settings.system ?? undefined,
|
||||
options: {
|
||||
...($settings.params ?? {})
|
||||
},
|
||||
messages: messages,
|
||||
history: history,
|
||||
tags: [],
|
||||
timestamp: Date.now()
|
||||
});
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
await chatId.set(chat.id);
|
||||
} else {
|
||||
await chatId.set('local');
|
||||
}
|
||||
await tick();
|
||||
}
|
||||
|
||||
const _chatId = JSON.parse(JSON.stringify($chatId));
|
||||
|
||||
await Promise.all(
|
||||
(modelId
|
||||
? [modelId]
|
||||
: atSelectedModel !== undefined
|
||||
? [atSelectedModel.id]
|
||||
: selectedModels
|
||||
).map(async (modelId) => {
|
||||
selectedModelIds.map(async (modelId) => {
|
||||
console.log('modelId', modelId);
|
||||
const model = $models.filter((m) => m.id === modelId).at(0);
|
||||
|
||||
@@ -408,33 +466,8 @@
|
||||
);
|
||||
}
|
||||
|
||||
// Create response message
|
||||
let responseMessageId = uuidv4();
|
||||
let responseMessage = {
|
||||
parentId: parentId,
|
||||
id: responseMessageId,
|
||||
childrenIds: [],
|
||||
role: 'assistant',
|
||||
content: '',
|
||||
model: model.id,
|
||||
modelName: model.name ?? model.id,
|
||||
userContext: null,
|
||||
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
|
||||
};
|
||||
|
||||
// Add message to history and Set currentId to messageId
|
||||
history.messages[responseMessageId] = responseMessage;
|
||||
history.currentId = responseMessageId;
|
||||
|
||||
// Append messageId to childrenIds of parent message
|
||||
if (parentId !== null) {
|
||||
history.messages[parentId].childrenIds = [
|
||||
...history.messages[parentId].childrenIds,
|
||||
responseMessageId
|
||||
];
|
||||
}
|
||||
|
||||
await tick();
|
||||
let responseMessageId = responseMessageIds[modelId];
|
||||
let responseMessage = history.messages[responseMessageId];
|
||||
|
||||
let userContext = null;
|
||||
if ($settings?.memory ?? false) {
|
||||
@@ -443,7 +476,6 @@
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
if (res.documents[0].length > 0) {
|
||||
userContext = res.documents.reduce((acc, doc, index) => {
|
||||
@@ -463,18 +495,17 @@
|
||||
responseMessage.userContext = userContext;
|
||||
|
||||
const chatEventEmitter = await getChatEventEmitter(model.id, _chatId);
|
||||
|
||||
if (webSearchEnabled) {
|
||||
await getWebSearchResults(model.id, parentId, responseMessageId);
|
||||
}
|
||||
|
||||
let _response = null;
|
||||
if (model?.owned_by === 'openai') {
|
||||
await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
|
||||
_response = await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
|
||||
} else if (model) {
|
||||
await sendPromptOllama(model, prompt, responseMessageId, _chatId);
|
||||
_response = await sendPromptOllama(model, prompt, responseMessageId, _chatId);
|
||||
}
|
||||
|
||||
console.log('chatEventEmitter', chatEventEmitter);
|
||||
_responses.push(_response);
|
||||
|
||||
if (chatEventEmitter) clearInterval(chatEventEmitter);
|
||||
} else {
|
||||
@@ -484,81 +515,11 @@
|
||||
);
|
||||
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
};
|
||||
|
||||
const getWebSearchResults = async (model: string, parentId: string, responseId: string) => {
|
||||
const responseMessage = history.messages[responseId];
|
||||
|
||||
responseMessage.status = {
|
||||
done: false,
|
||||
action: 'web_search',
|
||||
description: $i18n.t('Generating search query')
|
||||
};
|
||||
messages = messages;
|
||||
|
||||
const prompt = history.messages[parentId].content;
|
||||
let searchQuery = prompt;
|
||||
if (prompt.length > 100) {
|
||||
searchQuery = await generateChatSearchQuery(model, prompt);
|
||||
if (!searchQuery) {
|
||||
toast.warning($i18n.t('No search query generated'));
|
||||
responseMessage.status = {
|
||||
...responseMessage.status,
|
||||
done: true,
|
||||
error: true,
|
||||
description: 'No search query generated'
|
||||
};
|
||||
messages = messages;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
responseMessage.status = {
|
||||
...responseMessage.status,
|
||||
description: $i18n.t("Searching the web for '{{searchQuery}}'", { searchQuery })
|
||||
};
|
||||
messages = messages;
|
||||
|
||||
const results = await runWebSearch(localStorage.token, searchQuery).catch((error) => {
|
||||
console.log(error);
|
||||
toast.error(error);
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
if (results) {
|
||||
responseMessage.status = {
|
||||
...responseMessage.status,
|
||||
done: true,
|
||||
description: $i18n.t('Searched {{count}} sites', { count: results.filenames.length }),
|
||||
urls: results.filenames
|
||||
};
|
||||
|
||||
if (responseMessage?.files ?? undefined === undefined) {
|
||||
responseMessage.files = [];
|
||||
}
|
||||
|
||||
responseMessage.files.push({
|
||||
collection_name: results.collection_name,
|
||||
name: searchQuery,
|
||||
type: 'web_search_results',
|
||||
urls: results.filenames
|
||||
});
|
||||
|
||||
messages = messages;
|
||||
} else {
|
||||
responseMessage.status = {
|
||||
...responseMessage.status,
|
||||
done: true,
|
||||
error: true,
|
||||
description: 'No search results found'
|
||||
};
|
||||
messages = messages;
|
||||
}
|
||||
return _responses;
|
||||
};
|
||||
|
||||
const sendPromptOllama = async (model, userPrompt, responseMessageId, _chatId) => {
|
||||
model = model.id;
|
||||
let _response = null;
|
||||
|
||||
const responseMessage = history.messages[responseMessageId];
|
||||
|
||||
@@ -617,17 +578,39 @@
|
||||
}
|
||||
});
|
||||
|
||||
const docs = messages
|
||||
.filter((message) => message?.files ?? null)
|
||||
.map((message) =>
|
||||
message.files.filter((item) =>
|
||||
['doc', 'collection', 'web_search_results'].includes(item.type)
|
||||
let docs = [];
|
||||
|
||||
if (model?.info?.meta?.knowledge ?? false) {
|
||||
docs = model.info.meta.knowledge;
|
||||
}
|
||||
|
||||
docs = [
|
||||
...docs,
|
||||
...messages
|
||||
.filter((message) => message?.files ?? null)
|
||||
.map((message) =>
|
||||
message.files.filter((item) =>
|
||||
['doc', 'collection', 'web_search_results'].includes(item.type)
|
||||
)
|
||||
)
|
||||
)
|
||||
.flat(1);
|
||||
.flat(1)
|
||||
].filter(
|
||||
(item, index, array) =>
|
||||
array.findIndex((i) => JSON.stringify(i) === JSON.stringify(item)) === index
|
||||
);
|
||||
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('chat:start', {
|
||||
detail: {
|
||||
id: responseMessageId
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
await tick();
|
||||
|
||||
const [res, controller] = await generateChatCompletion(localStorage.token, {
|
||||
model: model,
|
||||
model: model.id,
|
||||
messages: messagesBody,
|
||||
options: {
|
||||
...($settings.params ?? {}),
|
||||
@@ -642,6 +625,7 @@
|
||||
},
|
||||
format: $settings.requestFormat ?? undefined,
|
||||
keep_alive: $settings.keepAlive ?? undefined,
|
||||
tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
|
||||
docs: docs.length > 0 ? docs : undefined,
|
||||
citations: docs.length > 0,
|
||||
chat_id: $chatId
|
||||
@@ -665,9 +649,10 @@
|
||||
controller.abort('User: Stop Response');
|
||||
} else {
|
||||
const messages = createMessagesList(responseMessageId);
|
||||
await chatCompletedHandler(model, messages);
|
||||
await chatCompletedHandler(model.id, messages);
|
||||
}
|
||||
|
||||
_response = responseMessage.content;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -693,6 +678,23 @@
|
||||
continue;
|
||||
} else {
|
||||
responseMessage.content += data.message.content;
|
||||
|
||||
const sentences = extractSentencesForAudio(responseMessage.content);
|
||||
sentences.pop();
|
||||
|
||||
// dispatch only last sentence and make sure it hasn't been dispatched before
|
||||
if (
|
||||
sentences.length > 0 &&
|
||||
sentences[sentences.length - 1] !== responseMessage.lastSentence
|
||||
) {
|
||||
responseMessage.lastSentence = sentences[sentences.length - 1];
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('chat', {
|
||||
detail: { id: responseMessageId, content: sentences[sentences.length - 1] }
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
messages = messages;
|
||||
}
|
||||
} else {
|
||||
@@ -719,25 +721,17 @@
|
||||
messages = messages;
|
||||
|
||||
if ($settings.notificationEnabled && !document.hasFocus()) {
|
||||
const notification = new Notification(
|
||||
selectedModelfile
|
||||
? `${
|
||||
selectedModelfile.title.charAt(0).toUpperCase() +
|
||||
selectedModelfile.title.slice(1)
|
||||
}`
|
||||
: `${model}`,
|
||||
{
|
||||
body: responseMessage.content,
|
||||
icon: selectedModelfile?.imageUrl ?? `${WEBUI_BASE_URL}/static/favicon.png`
|
||||
}
|
||||
);
|
||||
const notification = new Notification(`${model.id}`, {
|
||||
body: responseMessage.content,
|
||||
icon: `${WEBUI_BASE_URL}/static/favicon.png`
|
||||
});
|
||||
}
|
||||
|
||||
if ($settings.responseAutoCopy) {
|
||||
if ($settings?.responseAutoCopy ?? false) {
|
||||
copyToClipboard(responseMessage.content);
|
||||
}
|
||||
|
||||
if ($settings.responseAutoPlayback) {
|
||||
if ($settings.responseAutoPlayback && !$showCallOverlay) {
|
||||
await tick();
|
||||
document.getElementById(`speak-button-${responseMessage.id}`)?.click();
|
||||
}
|
||||
@@ -795,6 +789,23 @@
|
||||
stopResponseFlag = false;
|
||||
await tick();
|
||||
|
||||
let lastSentence = extractSentencesForAudio(responseMessage.content)?.at(-1) ?? '';
|
||||
if (lastSentence) {
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('chat', {
|
||||
detail: { id: responseMessageId, content: lastSentence }
|
||||
})
|
||||
);
|
||||
}
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('chat:finish', {
|
||||
detail: {
|
||||
id: responseMessageId,
|
||||
content: responseMessage.content
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
if (autoScroll) {
|
||||
scrollToBottom();
|
||||
}
|
||||
@@ -804,24 +815,46 @@
|
||||
const _title = await generateChatTitle(userPrompt);
|
||||
await setChatTitle(_chatId, _title);
|
||||
}
|
||||
|
||||
return _response;
|
||||
};
|
||||
|
||||
const sendPromptOpenAI = async (model, userPrompt, responseMessageId, _chatId) => {
|
||||
let _response = null;
|
||||
const responseMessage = history.messages[responseMessageId];
|
||||
|
||||
const docs = messages
|
||||
.filter((message) => message?.files ?? null)
|
||||
.map((message) =>
|
||||
message.files.filter((item) =>
|
||||
['doc', 'collection', 'web_search_results'].includes(item.type)
|
||||
)
|
||||
)
|
||||
.flat(1);
|
||||
let docs = [];
|
||||
|
||||
console.log(docs);
|
||||
if (model?.info?.meta?.knowledge ?? false) {
|
||||
docs = model.info.meta.knowledge;
|
||||
}
|
||||
|
||||
docs = [
|
||||
...docs,
|
||||
...messages
|
||||
.filter((message) => message?.files ?? null)
|
||||
.map((message) =>
|
||||
message.files.filter((item) =>
|
||||
['doc', 'collection', 'web_search_results'].includes(item.type)
|
||||
)
|
||||
)
|
||||
.flat(1)
|
||||
].filter(
|
||||
(item, index, array) =>
|
||||
array.findIndex((i) => JSON.stringify(i) === JSON.stringify(item)) === index
|
||||
);
|
||||
|
||||
scrollToBottom();
|
||||
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('chat:start', {
|
||||
detail: {
|
||||
id: responseMessageId
|
||||
}
|
||||
})
|
||||
);
|
||||
await tick();
|
||||
|
||||
try {
|
||||
const [res, controller] = await generateOpenAIChatCompletion(
|
||||
localStorage.token,
|
||||
@@ -889,6 +922,7 @@
|
||||
top_p: $settings?.params?.top_p ?? undefined,
|
||||
frequency_penalty: $settings?.params?.frequency_penalty ?? undefined,
|
||||
max_tokens: $settings?.params?.max_tokens ?? undefined,
|
||||
tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
|
||||
docs: docs.length > 0 ? docs : undefined,
|
||||
citations: docs.length > 0,
|
||||
chat_id: $chatId
|
||||
@@ -923,6 +957,8 @@
|
||||
await chatCompletedHandler(model.id, messages);
|
||||
}
|
||||
|
||||
_response = responseMessage.content;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -939,6 +975,23 @@
|
||||
continue;
|
||||
} else {
|
||||
responseMessage.content += value;
|
||||
|
||||
const sentences = extractSentencesForAudio(responseMessage.content);
|
||||
sentences.pop();
|
||||
|
||||
// dispatch only last sentence and make sure it hasn't been dispatched before
|
||||
if (
|
||||
sentences.length > 0 &&
|
||||
sentences[sentences.length - 1] !== responseMessage.lastSentence
|
||||
) {
|
||||
responseMessage.lastSentence = sentences[sentences.length - 1];
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('chat', {
|
||||
detail: { id: responseMessageId, content: sentences[sentences.length - 1] }
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
messages = messages;
|
||||
}
|
||||
|
||||
@@ -948,7 +1001,7 @@
|
||||
}
|
||||
|
||||
if ($settings.notificationEnabled && !document.hasFocus()) {
|
||||
const notification = new Notification(`OpenAI ${model}`, {
|
||||
const notification = new Notification(`${model.id}`, {
|
||||
body: responseMessage.content,
|
||||
icon: `${WEBUI_BASE_URL}/static/favicon.png`
|
||||
});
|
||||
@@ -958,8 +1011,9 @@
|
||||
copyToClipboard(responseMessage.content);
|
||||
}
|
||||
|
||||
if ($settings.responseAutoPlayback) {
|
||||
if ($settings.responseAutoPlayback && !$showCallOverlay) {
|
||||
await tick();
|
||||
|
||||
document.getElementById(`speak-button-${responseMessage.id}`)?.click();
|
||||
}
|
||||
|
||||
@@ -988,6 +1042,24 @@
|
||||
stopResponseFlag = false;
|
||||
await tick();
|
||||
|
||||
let lastSentence = extractSentencesForAudio(responseMessage.content)?.at(-1) ?? '';
|
||||
if (lastSentence) {
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('chat', {
|
||||
detail: { id: responseMessageId, content: lastSentence }
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('chat:finish', {
|
||||
detail: {
|
||||
id: responseMessageId,
|
||||
content: responseMessage.content
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
if (autoScroll) {
|
||||
scrollToBottom();
|
||||
}
|
||||
@@ -998,6 +1070,8 @@
|
||||
const _title = await generateChatTitle(userPrompt);
|
||||
await setChatTitle(_chatId, _title);
|
||||
}
|
||||
|
||||
return _response;
|
||||
};
|
||||
|
||||
const handleOpenAIError = async (error, res: Response | null, model, responseMessage) => {
|
||||
@@ -1052,9 +1126,12 @@
|
||||
let userPrompt = userMessage.content;
|
||||
|
||||
if ((userMessage?.models ?? [...selectedModels]).length == 1) {
|
||||
// If user message has only one model selected, sendPrompt automatically selects it for regeneration
|
||||
await sendPrompt(userPrompt, userMessage.id);
|
||||
} else {
|
||||
await sendPrompt(userPrompt, userMessage.id, message.model);
|
||||
// If there are multiple models selected, use the model of the response message for regeneration
|
||||
// e.g. many model chat
|
||||
await sendPrompt(userPrompt, userMessage.id, { modelId: message.model });
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1093,28 +1170,15 @@
|
||||
|
||||
const generateChatTitle = async (userPrompt) => {
|
||||
if ($settings?.title?.auto ?? true) {
|
||||
const model = $models.find((model) => model.id === selectedModels[0]);
|
||||
|
||||
const titleModelId =
|
||||
model?.owned_by === 'openai' ?? false
|
||||
? $settings?.title?.modelExternal ?? selectedModels[0]
|
||||
: $settings?.title?.model ?? selectedModels[0];
|
||||
const titleModel = $models.find((model) => model.id === titleModelId);
|
||||
|
||||
console.log(titleModel);
|
||||
const title = await generateTitle(
|
||||
localStorage.token,
|
||||
$settings?.title?.prompt ??
|
||||
$i18n.t(
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':"
|
||||
) + ' {{prompt}}',
|
||||
titleModelId,
|
||||
selectedModels[0],
|
||||
userPrompt,
|
||||
$chatId,
|
||||
titleModel?.owned_by === 'openai' ?? false
|
||||
? `${OPENAI_API_BASE_URL}`
|
||||
: `${OLLAMA_API_BASE_URL}/v1`
|
||||
);
|
||||
$chatId
|
||||
).catch((error) => {
|
||||
console.error(error);
|
||||
return 'New Chat';
|
||||
});
|
||||
|
||||
return title;
|
||||
} else {
|
||||
@@ -1122,29 +1186,6 @@
|
||||
}
|
||||
};
|
||||
|
||||
const generateChatSearchQuery = async (modelId: string, prompt: string) => {
|
||||
const model = $models.find((model) => model.id === modelId);
|
||||
const taskModelId =
|
||||
model?.owned_by === 'openai' ?? false
|
||||
? $settings?.title?.modelExternal ?? modelId
|
||||
: $settings?.title?.model ?? modelId;
|
||||
const taskModel = $models.find((model) => model.id === taskModelId);
|
||||
|
||||
const previousMessages = messages
|
||||
.filter((message) => message.role === 'user')
|
||||
.map((message) => message.content);
|
||||
|
||||
return await generateSearchQuery(
|
||||
localStorage.token,
|
||||
taskModelId,
|
||||
previousMessages,
|
||||
prompt,
|
||||
taskModel?.owned_by === 'openai' ?? false
|
||||
? `${OPENAI_API_BASE_URL}`
|
||||
: `${OLLAMA_API_BASE_URL}/v1`
|
||||
);
|
||||
};
|
||||
|
||||
const setChatTitle = async (_chatId, _title) => {
|
||||
if (_chatId === $chatId) {
|
||||
title = _title;
|
||||
@@ -1156,33 +1197,89 @@
|
||||
}
|
||||
};
|
||||
|
||||
const getWebSearchResults = async (model: string, parentId: string, responseId: string) => {
|
||||
const responseMessage = history.messages[responseId];
|
||||
|
||||
responseMessage.statusHistory = [
|
||||
{
|
||||
done: false,
|
||||
action: 'web_search',
|
||||
description: $i18n.t('Generating search query')
|
||||
}
|
||||
];
|
||||
messages = messages;
|
||||
|
||||
const prompt = history.messages[parentId].content;
|
||||
let searchQuery = await generateSearchQuery(localStorage.token, model, messages, prompt).catch(
|
||||
(error) => {
|
||||
console.log(error);
|
||||
return prompt;
|
||||
}
|
||||
);
|
||||
|
||||
if (!searchQuery) {
|
||||
toast.warning($i18n.t('No search query generated'));
|
||||
responseMessage.statusHistory.push({
|
||||
done: true,
|
||||
error: true,
|
||||
action: 'web_search',
|
||||
description: 'No search query generated'
|
||||
});
|
||||
|
||||
messages = messages;
|
||||
}
|
||||
|
||||
responseMessage.statusHistory.push({
|
||||
done: false,
|
||||
action: 'web_search',
|
||||
description: $i18n.t(`Searching "{{searchQuery}}"`, { searchQuery })
|
||||
});
|
||||
messages = messages;
|
||||
|
||||
const results = await runWebSearch(localStorage.token, searchQuery).catch((error) => {
|
||||
console.log(error);
|
||||
toast.error(error);
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
if (results) {
|
||||
responseMessage.statusHistory.push({
|
||||
done: true,
|
||||
action: 'web_search',
|
||||
description: $i18n.t('Searched {{count}} sites', { count: results.filenames.length }),
|
||||
query: searchQuery,
|
||||
urls: results.filenames
|
||||
});
|
||||
|
||||
if (responseMessage?.files ?? undefined === undefined) {
|
||||
responseMessage.files = [];
|
||||
}
|
||||
|
||||
responseMessage.files.push({
|
||||
collection_name: results.collection_name,
|
||||
name: searchQuery,
|
||||
type: 'web_search_results',
|
||||
urls: results.filenames
|
||||
});
|
||||
|
||||
messages = messages;
|
||||
} else {
|
||||
responseMessage.statusHistory.push({
|
||||
done: true,
|
||||
error: true,
|
||||
action: 'web_search',
|
||||
description: 'No search results found'
|
||||
});
|
||||
messages = messages;
|
||||
}
|
||||
};
|
||||
|
||||
const getTags = async () => {
|
||||
return await getTagsById(localStorage.token, $chatId).catch(async (error) => {
|
||||
return [];
|
||||
});
|
||||
};
|
||||
|
||||
const addTag = async (tagName) => {
|
||||
const res = await addTagById(localStorage.token, $chatId, tagName);
|
||||
tags = await getTags();
|
||||
|
||||
chat = await updateChatById(localStorage.token, $chatId, {
|
||||
tags: tags
|
||||
});
|
||||
|
||||
_tags.set(await getAllChatTags(localStorage.token));
|
||||
};
|
||||
|
||||
const deleteTag = async (tagName) => {
|
||||
const res = await deleteTagById(localStorage.token, $chatId, tagName);
|
||||
tags = await getTags();
|
||||
|
||||
chat = await updateChatById(localStorage.token, $chatId, {
|
||||
tags: tags
|
||||
});
|
||||
|
||||
_tags.set(await getAllChatTags(localStorage.token));
|
||||
};
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
@@ -1193,6 +1290,19 @@
|
||||
</title>
|
||||
</svelte:head>
|
||||
|
||||
<audio id="audioElement" src="" style="display: none;" />
|
||||
|
||||
{#if $showCallOverlay}
|
||||
<CallOverlay
|
||||
{submitPrompt}
|
||||
{stopResponse}
|
||||
bind:files
|
||||
modelId={selectedModelIds?.at(0) ?? null}
|
||||
chatId={$chatId}
|
||||
{eventTarget}
|
||||
/>
|
||||
{/if}
|
||||
|
||||
{#if !chatIdProp || (loaded && chatIdProp)}
|
||||
<div
|
||||
class="h-screen max-h-[100dvh] {$showSidebar
|
||||
@@ -1266,8 +1376,16 @@
|
||||
bind:files
|
||||
bind:prompt
|
||||
bind:autoScroll
|
||||
bind:selectedToolIds
|
||||
bind:webSearchEnabled
|
||||
bind:atSelectedModel
|
||||
availableToolIds={selectedModelIds.reduce((a, e, i, arr) => {
|
||||
const model = $models.find((m) => m.id === e);
|
||||
if (model?.info?.meta?.toolIds ?? false) {
|
||||
return [...new Set([...a, ...model.info.meta.toolIds])];
|
||||
}
|
||||
return a;
|
||||
}, [])}
|
||||
{selectedModels}
|
||||
{messages}
|
||||
{submitPrompt}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,843 @@
|
||||
<script lang="ts">
|
||||
import { config, settings, showCallOverlay } from '$lib/stores';
|
||||
import { onMount, tick, getContext } from 'svelte';
|
||||
|
||||
import {
|
||||
blobToFile,
|
||||
calculateSHA256,
|
||||
extractSentencesForAudio,
|
||||
findWordIndices
|
||||
} from '$lib/utils';
|
||||
import { generateEmoji } from '$lib/apis';
|
||||
import { synthesizeOpenAISpeech, transcribeAudio } from '$lib/apis/audio';
|
||||
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import VideoInputMenu from './CallOverlay/VideoInputMenu.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let eventTarget: EventTarget;
|
||||
|
||||
export let submitPrompt: Function;
|
||||
export let stopResponse: Function;
|
||||
|
||||
export let files;
|
||||
|
||||
export let chatId;
|
||||
export let modelId;
|
||||
|
||||
let loading = false;
|
||||
let confirmed = false;
|
||||
let interrupted = false;
|
||||
|
||||
let emoji = null;
|
||||
|
||||
let camera = false;
|
||||
let cameraStream = null;
|
||||
|
||||
let chatStreaming = false;
|
||||
|
||||
let rmsLevel = 0;
|
||||
let hasStartedSpeaking = false;
|
||||
let mediaRecorder;
|
||||
let audioChunks = [];
|
||||
|
||||
let videoInputDevices = [];
|
||||
let selectedVideoInputDeviceId = null;
|
||||
|
||||
const getVideoInputDevices = async () => {
|
||||
const devices = await navigator.mediaDevices.enumerateDevices();
|
||||
videoInputDevices = devices.filter((device) => device.kind === 'videoinput');
|
||||
|
||||
if (!!navigator.mediaDevices.getDisplayMedia) {
|
||||
videoInputDevices = [
|
||||
...videoInputDevices,
|
||||
{
|
||||
deviceId: 'screen',
|
||||
label: 'Screen Share'
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
console.log(videoInputDevices);
|
||||
if (selectedVideoInputDeviceId === null && videoInputDevices.length > 0) {
|
||||
selectedVideoInputDeviceId = videoInputDevices[0].deviceId;
|
||||
}
|
||||
};
|
||||
|
||||
const startCamera = async () => {
|
||||
await getVideoInputDevices();
|
||||
|
||||
if (cameraStream === null) {
|
||||
camera = true;
|
||||
await tick();
|
||||
try {
|
||||
await startVideoStream();
|
||||
} catch (err) {
|
||||
console.error('Error accessing webcam: ', err);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const startVideoStream = async () => {
|
||||
const video = document.getElementById('camera-feed');
|
||||
if (video) {
|
||||
if (selectedVideoInputDeviceId === 'screen') {
|
||||
cameraStream = await navigator.mediaDevices.getDisplayMedia({
|
||||
video: {
|
||||
cursor: 'always'
|
||||
},
|
||||
audio: false
|
||||
});
|
||||
} else {
|
||||
cameraStream = await navigator.mediaDevices.getUserMedia({
|
||||
video: {
|
||||
deviceId: selectedVideoInputDeviceId ? { exact: selectedVideoInputDeviceId } : undefined
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (cameraStream) {
|
||||
await getVideoInputDevices();
|
||||
video.srcObject = cameraStream;
|
||||
await video.play();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const stopVideoStream = async () => {
|
||||
if (cameraStream) {
|
||||
const tracks = cameraStream.getTracks();
|
||||
tracks.forEach((track) => track.stop());
|
||||
}
|
||||
|
||||
cameraStream = null;
|
||||
};
|
||||
|
||||
const takeScreenshot = () => {
|
||||
const video = document.getElementById('camera-feed');
|
||||
const canvas = document.getElementById('camera-canvas');
|
||||
|
||||
if (!canvas) {
|
||||
return;
|
||||
}
|
||||
|
||||
const context = canvas.getContext('2d');
|
||||
|
||||
// Make the canvas match the video dimensions
|
||||
canvas.width = video.videoWidth;
|
||||
canvas.height = video.videoHeight;
|
||||
|
||||
// Draw the image from the video onto the canvas
|
||||
context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
|
||||
|
||||
// Convert the canvas to a data base64 URL and console log it
|
||||
const dataURL = canvas.toDataURL('image/png');
|
||||
console.log(dataURL);
|
||||
|
||||
return dataURL;
|
||||
};
|
||||
|
||||
const stopCamera = async () => {
|
||||
await stopVideoStream();
|
||||
camera = false;
|
||||
};
|
||||
|
||||
const MIN_DECIBELS = -55;
|
||||
const VISUALIZER_BUFFER_LENGTH = 300;
|
||||
|
||||
const transcribeHandler = async (audioBlob) => {
|
||||
// Create a blob from the audio chunks
|
||||
|
||||
await tick();
|
||||
const file = blobToFile(audioBlob, 'recording.wav');
|
||||
|
||||
const res = await transcribeAudio(localStorage.token, file).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
console.log(res.text);
|
||||
|
||||
if (res.text !== '') {
|
||||
const _responses = await submitPrompt(res.text, { _raw: true });
|
||||
console.log(_responses);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const stopRecordingCallback = async (_continue = true) => {
|
||||
if ($showCallOverlay) {
|
||||
console.log('%c%s', 'color: red; font-size: 20px;', '🚨 stopRecordingCallback 🚨');
|
||||
|
||||
// deep copy the audioChunks array
|
||||
const _audioChunks = audioChunks.slice(0);
|
||||
|
||||
audioChunks = [];
|
||||
mediaRecorder = false;
|
||||
|
||||
if (_continue) {
|
||||
startRecording();
|
||||
}
|
||||
|
||||
if (confirmed) {
|
||||
loading = true;
|
||||
emoji = null;
|
||||
|
||||
if (cameraStream) {
|
||||
const imageUrl = takeScreenshot();
|
||||
|
||||
files = [
|
||||
{
|
||||
type: 'image',
|
||||
url: imageUrl
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
const audioBlob = new Blob(_audioChunks, { type: 'audio/wav' });
|
||||
await transcribeHandler(audioBlob);
|
||||
|
||||
confirmed = false;
|
||||
loading = false;
|
||||
}
|
||||
} else {
|
||||
audioChunks = [];
|
||||
mediaRecorder = false;
|
||||
}
|
||||
};
|
||||
|
||||
const startRecording = async () => {
|
||||
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
||||
mediaRecorder = new MediaRecorder(stream);
|
||||
|
||||
mediaRecorder.onstart = () => {
|
||||
console.log('Recording started');
|
||||
audioChunks = [];
|
||||
analyseAudio(stream);
|
||||
};
|
||||
|
||||
mediaRecorder.ondataavailable = (event) => {
|
||||
if (hasStartedSpeaking) {
|
||||
audioChunks.push(event.data);
|
||||
}
|
||||
};
|
||||
|
||||
mediaRecorder.onstop = (e) => {
|
||||
console.log('Recording stopped', e);
|
||||
stopRecordingCallback();
|
||||
};
|
||||
|
||||
mediaRecorder.start();
|
||||
};
|
||||
|
||||
// Function to calculate the RMS level from time domain data
|
||||
const calculateRMS = (data: Uint8Array) => {
|
||||
let sumSquares = 0;
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
const normalizedValue = (data[i] - 128) / 128; // Normalize the data
|
||||
sumSquares += normalizedValue * normalizedValue;
|
||||
}
|
||||
return Math.sqrt(sumSquares / data.length);
|
||||
};
|
||||
|
||||
const analyseAudio = (stream) => {
|
||||
const audioContext = new AudioContext();
|
||||
const audioStreamSource = audioContext.createMediaStreamSource(stream);
|
||||
|
||||
const analyser = audioContext.createAnalyser();
|
||||
analyser.minDecibels = MIN_DECIBELS;
|
||||
audioStreamSource.connect(analyser);
|
||||
|
||||
const bufferLength = analyser.frequencyBinCount;
|
||||
|
||||
const domainData = new Uint8Array(bufferLength);
|
||||
const timeDomainData = new Uint8Array(analyser.fftSize);
|
||||
|
||||
let lastSoundTime = Date.now();
|
||||
hasStartedSpeaking = false;
|
||||
|
||||
console.log('🔊 Sound detection started', lastSoundTime, hasStartedSpeaking);
|
||||
|
||||
const detectSound = () => {
|
||||
const processFrame = () => {
|
||||
if (!mediaRecorder || !$showCallOverlay) {
|
||||
return;
|
||||
}
|
||||
|
||||
analyser.getByteTimeDomainData(timeDomainData);
|
||||
analyser.getByteFrequencyData(domainData);
|
||||
|
||||
// Calculate RMS level from time domain data
|
||||
rmsLevel = calculateRMS(timeDomainData);
|
||||
|
||||
// Check if initial speech/noise has started
|
||||
const hasSound = domainData.some((value) => value > 0);
|
||||
if (hasSound) {
|
||||
// BIG RED TEXT
|
||||
console.log('%c%s', 'color: red; font-size: 20px;', '🔊 Sound detected');
|
||||
|
||||
if (!hasStartedSpeaking) {
|
||||
hasStartedSpeaking = true;
|
||||
stopAllAudio();
|
||||
}
|
||||
|
||||
lastSoundTime = Date.now();
|
||||
}
|
||||
|
||||
// Start silence detection only after initial speech/noise has been detected
|
||||
if (hasStartedSpeaking) {
|
||||
if (Date.now() - lastSoundTime > 2000) {
|
||||
confirmed = true;
|
||||
|
||||
if (mediaRecorder) {
|
||||
console.log('%c%s', 'color: red; font-size: 20px;', '🔇 Silence detected');
|
||||
mediaRecorder.stop();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.requestAnimationFrame(processFrame);
|
||||
};
|
||||
|
||||
window.requestAnimationFrame(processFrame);
|
||||
};
|
||||
|
||||
detectSound();
|
||||
};
|
||||
|
||||
let finishedMessages = {};
|
||||
let currentMessageId = null;
|
||||
let currentUtterance = null;
|
||||
|
||||
const speakSpeechSynthesisHandler = (content) => {
|
||||
if ($showCallOverlay) {
|
||||
return new Promise((resolve) => {
|
||||
let voices = [];
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
if (voices.length > 0) {
|
||||
clearInterval(getVoicesLoop);
|
||||
|
||||
const voice =
|
||||
voices
|
||||
?.filter(
|
||||
(v) => v.voiceURI === ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice)
|
||||
)
|
||||
?.at(0) ?? undefined;
|
||||
|
||||
currentUtterance = new SpeechSynthesisUtterance(content);
|
||||
|
||||
if (voice) {
|
||||
currentUtterance.voice = voice;
|
||||
}
|
||||
|
||||
speechSynthesis.speak(currentUtterance);
|
||||
currentUtterance.onend = async (e) => {
|
||||
await new Promise((r) => setTimeout(r, 200));
|
||||
resolve(e);
|
||||
};
|
||||
}
|
||||
}, 100);
|
||||
});
|
||||
} else {
|
||||
return Promise.resolve();
|
||||
}
|
||||
};
|
||||
|
||||
const playAudio = (audio) => {
|
||||
if ($showCallOverlay) {
|
||||
return new Promise((resolve) => {
|
||||
const audioElement = document.getElementById('audioElement');
|
||||
|
||||
if (audioElement) {
|
||||
audioElement.src = audio.src;
|
||||
audioElement.muted = true;
|
||||
|
||||
audioElement
|
||||
.play()
|
||||
.then(() => {
|
||||
audioElement.muted = false;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error(error);
|
||||
});
|
||||
|
||||
audioElement.onended = async (e) => {
|
||||
await new Promise((r) => setTimeout(r, 100));
|
||||
resolve(e);
|
||||
};
|
||||
}
|
||||
});
|
||||
} else {
|
||||
return Promise.resolve();
|
||||
}
|
||||
};
|
||||
|
||||
const stopAllAudio = async () => {
|
||||
interrupted = true;
|
||||
|
||||
if (chatStreaming) {
|
||||
stopResponse();
|
||||
}
|
||||
|
||||
if (currentUtterance) {
|
||||
speechSynthesis.cancel();
|
||||
currentUtterance = null;
|
||||
}
|
||||
|
||||
const audioElement = document.getElementById('audioElement');
|
||||
if (audioElement) {
|
||||
audioElement.muted = true;
|
||||
audioElement.pause();
|
||||
audioElement.currentTime = 0;
|
||||
}
|
||||
};
|
||||
|
||||
let audioAbortController = new AbortController();
|
||||
|
||||
// Audio cache map where key is the content and value is the Audio object.
|
||||
const audioCache = new Map();
|
||||
const emojiCache = new Map();
|
||||
|
||||
const fetchAudio = async (content) => {
|
||||
if (!audioCache.has(content)) {
|
||||
try {
|
||||
// Set the emoji for the content if needed
|
||||
if ($settings?.showEmojiInCall ?? false) {
|
||||
const emoji = await generateEmoji(localStorage.token, modelId, content, chatId);
|
||||
if (emoji) {
|
||||
emojiCache.set(content, emoji);
|
||||
}
|
||||
}
|
||||
|
||||
if ($config.audio.tts.engine !== '') {
|
||||
const res = await synthesizeOpenAISpeech(
|
||||
localStorage.token,
|
||||
$settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice,
|
||||
content
|
||||
).catch((error) => {
|
||||
console.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
const blob = await res.blob();
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
audioCache.set(content, new Audio(blobUrl));
|
||||
}
|
||||
} else {
|
||||
audioCache.set(content, true);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error synthesizing speech:', error);
|
||||
}
|
||||
}
|
||||
|
||||
return audioCache.get(content);
|
||||
};
|
||||
|
||||
let messages = {};
|
||||
|
||||
const monitorAndPlayAudio = async (id, signal) => {
|
||||
while (!signal.aborted) {
|
||||
if (messages[id] && messages[id].length > 0) {
|
||||
// Retrieve the next content string from the queue
|
||||
const content = messages[id].shift(); // Dequeues the content for playing
|
||||
|
||||
if (audioCache.has(content)) {
|
||||
// If content is available in the cache, play it
|
||||
|
||||
// Set the emoji for the content if available
|
||||
if (($settings?.showEmojiInCall ?? false) && emojiCache.has(content)) {
|
||||
emoji = emojiCache.get(content);
|
||||
} else {
|
||||
emoji = null;
|
||||
}
|
||||
|
||||
if ($config.audio.tts.engine !== '') {
|
||||
try {
|
||||
console.log(
|
||||
'%c%s',
|
||||
'color: red; font-size: 20px;',
|
||||
`Playing audio for content: ${content}`
|
||||
);
|
||||
|
||||
const audio = audioCache.get(content);
|
||||
await playAudio(audio); // Here ensure that playAudio is indeed correct method to execute
|
||||
console.log(`Played audio for content: ${content}`);
|
||||
await new Promise((resolve) => setTimeout(resolve, 200)); // Wait before retrying to reduce tight loop
|
||||
} catch (error) {
|
||||
console.error('Error playing audio:', error);
|
||||
}
|
||||
} else {
|
||||
await speakSpeechSynthesisHandler(content);
|
||||
}
|
||||
} else {
|
||||
// If not available in the cache, push it back to the queue and delay
|
||||
messages[id].unshift(content); // Re-queue the content at the start
|
||||
console.log(`Audio for "${content}" not yet available in the cache, re-queued...`);
|
||||
await new Promise((resolve) => setTimeout(resolve, 200)); // Wait before retrying to reduce tight loop
|
||||
}
|
||||
} else if (finishedMessages[id] && messages[id] && messages[id].length === 0) {
|
||||
// If the message is finished and there are no more messages to process, break the loop
|
||||
break;
|
||||
} else {
|
||||
// No messages to process, sleep for a bit
|
||||
await new Promise((resolve) => setTimeout(resolve, 200));
|
||||
}
|
||||
}
|
||||
console.log(`Audio monitoring and playing stopped for message ID ${id}`);
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
startRecording();
|
||||
|
||||
const chatStartHandler = async (e) => {
|
||||
const { id } = e.detail;
|
||||
|
||||
chatStreaming = true;
|
||||
|
||||
if (currentMessageId !== id) {
|
||||
console.log(`Received chat start event for message ID ${id}`);
|
||||
|
||||
currentMessageId = id;
|
||||
if (audioAbortController) {
|
||||
audioAbortController.abort();
|
||||
}
|
||||
audioAbortController = new AbortController();
|
||||
|
||||
// Start monitoring and playing audio for the message ID
|
||||
monitorAndPlayAudio(id, audioAbortController.signal);
|
||||
}
|
||||
};
|
||||
|
||||
const chatEventHandler = async (e) => {
|
||||
const { id, content } = e.detail;
|
||||
// "id" here is message id
|
||||
// if "id" is not the same as "currentMessageId" then do not process
|
||||
// "content" here is a sentence from the assistant,
|
||||
// there will be many sentences for the same "id"
|
||||
|
||||
if (currentMessageId === id) {
|
||||
console.log(`Received chat event for message ID ${id}: ${content}`);
|
||||
|
||||
try {
|
||||
if (messages[id] === undefined) {
|
||||
messages[id] = [content];
|
||||
} else {
|
||||
messages[id].push(content);
|
||||
}
|
||||
|
||||
console.log(content);
|
||||
|
||||
fetchAudio(content);
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch or play audio:', error);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const chatFinishHandler = async (e) => {
|
||||
const { id, content } = e.detail;
|
||||
// "content" here is the entire message from the assistant
|
||||
|
||||
chatStreaming = false;
|
||||
finishedMessages[id] = true;
|
||||
};
|
||||
|
||||
eventTarget.addEventListener('chat:start', chatStartHandler);
|
||||
eventTarget.addEventListener('chat', chatEventHandler);
|
||||
eventTarget.addEventListener('chat:finish', chatFinishHandler);
|
||||
|
||||
return async () => {
|
||||
eventTarget.removeEventListener('chat:start', chatStartHandler);
|
||||
eventTarget.removeEventListener('chat', chatEventHandler);
|
||||
eventTarget.removeEventListener('chat:finish', chatFinishHandler);
|
||||
|
||||
audioAbortController.abort();
|
||||
await tick();
|
||||
|
||||
await stopAllAudio();
|
||||
|
||||
await stopRecordingCallback(false);
|
||||
await stopCamera();
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
{#if $showCallOverlay}
|
||||
<div class=" absolute w-full h-screen max-h-[100dvh] flex z-[999] overflow-hidden">
|
||||
<div
|
||||
class="absolute w-full h-screen max-h-[100dvh] bg-white text-gray-700 dark:bg-black dark:text-gray-300 flex justify-center"
|
||||
>
|
||||
<div class="max-w-lg w-full h-screen max-h-[100dvh] flex flex-col justify-between p-3 md:p-6">
|
||||
{#if camera}
|
||||
<div class="flex justify-center items-center w-full h-20 min-h-20">
|
||||
{#if emoji}
|
||||
<div
|
||||
class=" transition-all rounded-full"
|
||||
style="font-size:{rmsLevel * 100 > 4
|
||||
? '4.5'
|
||||
: rmsLevel * 100 > 2
|
||||
? '4.25'
|
||||
: rmsLevel * 100 > 1
|
||||
? '3.75'
|
||||
: '3.5'}rem;width: 100%; text-align:center;"
|
||||
>
|
||||
{emoji}
|
||||
</div>
|
||||
{:else if loading}
|
||||
<svg
|
||||
class="size-12 text-gray-900 dark:text-gray-400"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
><style>
|
||||
.spinner_qM83 {
|
||||
animation: spinner_8HQG 1.05s infinite;
|
||||
}
|
||||
.spinner_oXPr {
|
||||
animation-delay: 0.1s;
|
||||
}
|
||||
.spinner_ZTLf {
|
||||
animation-delay: 0.2s;
|
||||
}
|
||||
@keyframes spinner_8HQG {
|
||||
0%,
|
||||
57.14% {
|
||||
animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);
|
||||
transform: translate(0);
|
||||
}
|
||||
28.57% {
|
||||
animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);
|
||||
transform: translateY(-6px);
|
||||
}
|
||||
100% {
|
||||
transform: translate(0);
|
||||
}
|
||||
}
|
||||
</style><circle class="spinner_qM83" cx="4" cy="12" r="3" /><circle
|
||||
class="spinner_qM83 spinner_oXPr"
|
||||
cx="12"
|
||||
cy="12"
|
||||
r="3"
|
||||
/><circle class="spinner_qM83 spinner_ZTLf" cx="20" cy="12" r="3" /></svg
|
||||
>
|
||||
{:else}
|
||||
<div
|
||||
class=" {rmsLevel * 100 > 4
|
||||
? ' size-[4.5rem]'
|
||||
: rmsLevel * 100 > 2
|
||||
? ' size-16'
|
||||
: rmsLevel * 100 > 1
|
||||
? 'size-14'
|
||||
: 'size-12'} transition-all bg-black dark:bg-white rounded-full"
|
||||
/>
|
||||
{/if}
|
||||
<!-- navbar -->
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="flex justify-center items-center flex-1 h-full w-full max-h-full">
|
||||
{#if !camera}
|
||||
{#if emoji}
|
||||
<div
|
||||
class=" transition-all rounded-full"
|
||||
style="font-size:{rmsLevel * 100 > 4
|
||||
? '13'
|
||||
: rmsLevel * 100 > 2
|
||||
? '12'
|
||||
: rmsLevel * 100 > 1
|
||||
? '11.5'
|
||||
: '11'}rem;width:100%;text-align:center;"
|
||||
>
|
||||
{emoji}
|
||||
</div>
|
||||
{:else if loading}
|
||||
<svg
|
||||
class="size-44 text-gray-900 dark:text-gray-400"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
><style>
|
||||
.spinner_qM83 {
|
||||
animation: spinner_8HQG 1.05s infinite;
|
||||
}
|
||||
.spinner_oXPr {
|
||||
animation-delay: 0.1s;
|
||||
}
|
||||
.spinner_ZTLf {
|
||||
animation-delay: 0.2s;
|
||||
}
|
||||
@keyframes spinner_8HQG {
|
||||
0%,
|
||||
57.14% {
|
||||
animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);
|
||||
transform: translate(0);
|
||||
}
|
||||
28.57% {
|
||||
animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);
|
||||
transform: translateY(-6px);
|
||||
}
|
||||
100% {
|
||||
transform: translate(0);
|
||||
}
|
||||
}
|
||||
</style><circle class="spinner_qM83" cx="4" cy="12" r="3" /><circle
|
||||
class="spinner_qM83 spinner_oXPr"
|
||||
cx="12"
|
||||
cy="12"
|
||||
r="3"
|
||||
/><circle class="spinner_qM83 spinner_ZTLf" cx="20" cy="12" r="3" /></svg
|
||||
>
|
||||
{:else}
|
||||
<div
|
||||
class=" {rmsLevel * 100 > 4
|
||||
? ' size-52'
|
||||
: rmsLevel * 100 > 2
|
||||
? 'size-48'
|
||||
: rmsLevel * 100 > 1
|
||||
? 'size-[11.5rem]'
|
||||
: 'size-44'} transition-all bg-black dark:bg-white rounded-full"
|
||||
/>
|
||||
{/if}
|
||||
{:else}
|
||||
<div
|
||||
class="relative flex video-container w-full max-h-full pt-2 pb-4 md:py-6 px-2 h-full"
|
||||
>
|
||||
<video
|
||||
id="camera-feed"
|
||||
autoplay
|
||||
class="rounded-2xl h-full min-w-full object-cover object-center"
|
||||
playsinline
|
||||
/>
|
||||
|
||||
<canvas id="camera-canvas" style="display:none;" />
|
||||
|
||||
<div class=" absolute top-4 md:top-8 left-4">
|
||||
<button
|
||||
type="button"
|
||||
class="p-1.5 text-white cursor-pointer backdrop-blur-xl bg-black/10 rounded-full"
|
||||
on:click={() => {
|
||||
stopCamera();
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="size-6"
|
||||
>
|
||||
<path
|
||||
d="M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex justify-between items-center pb-2 w-full">
|
||||
<div>
|
||||
{#if camera}
|
||||
<VideoInputMenu
|
||||
devices={videoInputDevices}
|
||||
on:change={async (e) => {
|
||||
console.log(e.detail);
|
||||
selectedVideoInputDeviceId = e.detail;
|
||||
await stopVideoStream();
|
||||
await startVideoStream();
|
||||
}}
|
||||
>
|
||||
<button class=" p-3 rounded-full bg-gray-50 dark:bg-gray-900" type="button">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="size-5"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M15.312 11.424a5.5 5.5 0 0 1-9.201 2.466l-.312-.311h2.433a.75.75 0 0 0 0-1.5H3.989a.75.75 0 0 0-.75.75v4.242a.75.75 0 0 0 1.5 0v-2.43l.31.31a7 7 0 0 0 11.712-3.138.75.75 0 0 0-1.449-.39Zm1.23-3.723a.75.75 0 0 0 .219-.53V2.929a.75.75 0 0 0-1.5 0V5.36l-.31-.31A7 7 0 0 0 3.239 8.188a.75.75 0 1 0 1.448.389A5.5 5.5 0 0 1 13.89 6.11l.311.31h-2.432a.75.75 0 0 0 0 1.5h4.243a.75.75 0 0 0 .53-.219Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</VideoInputMenu>
|
||||
{:else}
|
||||
<Tooltip content={$i18n.t('Camera')}>
|
||||
<button
|
||||
class=" p-3 rounded-full bg-gray-50 dark:bg-gray-900"
|
||||
type="button"
|
||||
on:click={async () => {
|
||||
await navigator.mediaDevices.getUserMedia({ video: true });
|
||||
startCamera();
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="size-5"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M6.827 6.175A2.31 2.31 0 0 1 5.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 0 0-1.134-.175 2.31 2.31 0 0 1-1.64-1.055l-.822-1.316a2.192 2.192 0 0 0-1.736-1.039 48.774 48.774 0 0 0-5.232 0 2.192 2.192 0 0 0-1.736 1.039l-.821 1.316Z"
|
||||
/>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M16.5 12.75a4.5 4.5 0 1 1-9 0 4.5 4.5 0 0 1 9 0ZM18.75 10.5h.008v.008h-.008V10.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button type="button">
|
||||
<div class=" line-clamp-1 text-sm font-medium">
|
||||
{#if loading}
|
||||
{$i18n.t('Thinking...')}
|
||||
{:else}
|
||||
{$i18n.t('Listening...')}
|
||||
{/if}
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button
|
||||
class=" p-3 rounded-full bg-gray-50 dark:bg-gray-900"
|
||||
on:click={async () => {
|
||||
showCallOverlay.set(false);
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="size-5"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
@@ -0,0 +1,51 @@
|
||||
<script lang="ts">
|
||||
import { DropdownMenu } from 'bits-ui';
|
||||
import { flyAndScale } from '$lib/utils/transitions';
|
||||
import { getContext, createEventDispatcher } from 'svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
import Dropdown from '$lib/components/common/Dropdown.svelte';
|
||||
|
||||
export let onClose: Function = () => {};
|
||||
export let devices: any;
|
||||
|
||||
let show = false;
|
||||
</script>
|
||||
|
||||
<Dropdown
|
||||
bind:show
|
||||
on:change={(e) => {
|
||||
if (e.detail === false) {
|
||||
onClose();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<slot />
|
||||
|
||||
<div slot="content">
|
||||
<DropdownMenu.Content
|
||||
class="w-full max-w-[180px] rounded-lg px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-[9999] bg-white dark:bg-gray-900 dark:text-white shadow-sm"
|
||||
sideOffset={6}
|
||||
side="top"
|
||||
align="start"
|
||||
transition={flyAndScale}
|
||||
>
|
||||
{#each devices as device}
|
||||
<DropdownMenu.Item
|
||||
class="flex gap-2 items-center px-3 py-2 text-sm cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
on:click={() => {
|
||||
dispatch('change', device.deviceId);
|
||||
}}
|
||||
>
|
||||
<div class="flex items-center">
|
||||
<div class=" line-clamp-1">
|
||||
{device?.label ?? 'Camera'}
|
||||
</div>
|
||||
</div>
|
||||
</DropdownMenu.Item>
|
||||
{/each}
|
||||
</DropdownMenu.Content>
|
||||
</div>
|
||||
</Dropdown>
|
||||
@@ -101,18 +101,20 @@
|
||||
</script>
|
||||
|
||||
{#if filteredItems.length > 0 || prompt.split(' ')?.at(0)?.substring(1).startsWith('http')}
|
||||
<div class="md:px-2 mb-3 text-left w-full absolute bottom-0 left-0 right-0">
|
||||
<div class="pl-1 pr-12 mb-3 text-left w-full absolute bottom-0 left-0 right-0">
|
||||
<div class="flex w-full px-2">
|
||||
<div class=" bg-gray-100 dark:bg-gray-700 w-10 rounded-l-xl text-center">
|
||||
<div class=" text-lg font-semibold mt-2">#</div>
|
||||
</div>
|
||||
|
||||
<div class="max-h-60 flex flex-col w-full rounded-r-xl bg-white">
|
||||
<div
|
||||
class="max-h-60 flex flex-col w-full rounded-r-xl bg-white dark:bg-gray-850 dark:text-gray-100"
|
||||
>
|
||||
<div class="m-1 overflow-y-auto p-1 rounded-r-xl space-y-0.5">
|
||||
{#each filteredItems as doc, docIdx}
|
||||
<button
|
||||
class=" px-3 py-1.5 rounded-xl w-full text-left {docIdx === selectedIdx
|
||||
? ' bg-gray-100 selected-command-option-button'
|
||||
? ' bg-gray-100 dark:bg-gray-600 dark:text-gray-100 selected-command-option-button'
|
||||
: ''}"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
@@ -126,17 +128,19 @@
|
||||
on:focus={() => {}}
|
||||
>
|
||||
{#if doc.type === 'collection'}
|
||||
<div class=" font-medium text-black line-clamp-1">
|
||||
<div class=" font-medium text-black dark:text-gray-100 line-clamp-1">
|
||||
{doc?.title ?? `#${doc.name}`}
|
||||
</div>
|
||||
|
||||
<div class=" text-xs text-gray-600 line-clamp-1">{$i18n.t('Collection')}</div>
|
||||
<div class=" text-xs text-gray-600 dark:text-gray-100 line-clamp-1">
|
||||
{$i18n.t('Collection')}
|
||||
</div>
|
||||
{:else}
|
||||
<div class=" font-medium text-black line-clamp-1">
|
||||
<div class=" font-medium text-black dark:text-gray-100 line-clamp-1">
|
||||
#{doc.name} ({doc.filename})
|
||||
</div>
|
||||
|
||||
<div class=" text-xs text-gray-600 line-clamp-1">
|
||||
<div class=" text-xs text-gray-600 dark:text-gray-100 line-clamp-1">
|
||||
{doc.title}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -4,24 +4,33 @@
|
||||
import { getContext } from 'svelte';
|
||||
|
||||
import Dropdown from '$lib/components/common/Dropdown.svelte';
|
||||
import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
|
||||
import Pencil from '$lib/components/icons/Pencil.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import Tags from '$lib/components/chat/Tags.svelte';
|
||||
import Share from '$lib/components/icons/Share.svelte';
|
||||
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
|
||||
import DocumentArrowUpSolid from '$lib/components/icons/DocumentArrowUpSolid.svelte';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
import GlobeAltSolid from '$lib/components/icons/GlobeAltSolid.svelte';
|
||||
import { config } from '$lib/stores';
|
||||
import WrenchSolid from '$lib/components/icons/WrenchSolid.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let uploadFilesHandler: Function;
|
||||
|
||||
export let selectedToolIds: string[] = [];
|
||||
export let webSearchEnabled: boolean;
|
||||
|
||||
export let tools = {};
|
||||
export let onClose: Function;
|
||||
|
||||
$: tools = Object.fromEntries(
|
||||
Object.keys(tools).map((toolId) => [
|
||||
toolId,
|
||||
{
|
||||
...tools[toolId],
|
||||
enabled: selectedToolIds.includes(toolId)
|
||||
}
|
||||
])
|
||||
);
|
||||
|
||||
let show = false;
|
||||
</script>
|
||||
|
||||
@@ -39,20 +48,48 @@
|
||||
|
||||
<div slot="content">
|
||||
<DropdownMenu.Content
|
||||
class="w-full max-w-[190px] rounded-xl px-1 py-1 border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow"
|
||||
class="w-full max-w-[200px] rounded-xl px-1 py-1 border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow"
|
||||
sideOffset={15}
|
||||
alignOffset={-8}
|
||||
side="top"
|
||||
align="start"
|
||||
transition={flyAndScale}
|
||||
>
|
||||
{#if Object.keys(tools).length > 0}
|
||||
<div class=" max-h-28 overflow-y-auto scrollbar-hidden">
|
||||
{#each Object.keys(tools) as toolId}
|
||||
<div
|
||||
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
|
||||
>
|
||||
<div class="flex-1 flex items-center gap-2">
|
||||
<WrenchSolid />
|
||||
<Tooltip content={tools[toolId]?.description ?? ''} className="flex-1">
|
||||
<div class=" line-clamp-1">{tools[toolId].name}</div>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
<Switch
|
||||
bind:state={tools[toolId].enabled}
|
||||
on:change={(e) => {
|
||||
selectedToolIds = e.detail
|
||||
? [...selectedToolIds, toolId]
|
||||
: selectedToolIds.filter((id) => id !== toolId);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<hr class="border-gray-100 dark:border-gray-800 my-1" />
|
||||
{/if}
|
||||
|
||||
{#if $config?.features?.enable_web_search}
|
||||
<div
|
||||
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
|
||||
>
|
||||
<div class="flex-1 flex items-center gap-2">
|
||||
<GlobeAltSolid />
|
||||
<div class="flex items-center">{$i18n.t('Web Search')}</div>
|
||||
<div class=" line-clamp-1">{$i18n.t('Web Search')}</div>
|
||||
</div>
|
||||
|
||||
<Switch bind:state={webSearchEnabled} />
|
||||
@@ -68,7 +105,7 @@
|
||||
}}
|
||||
>
|
||||
<DocumentArrowUpSolid />
|
||||
<div class="flex items-center">{$i18n.t('Upload Files')}</div>
|
||||
<div class=" line-clamp-1">{$i18n.t('Upload Files')}</div>
|
||||
</DropdownMenu.Item>
|
||||
</DropdownMenu.Content>
|
||||
</div>
|
||||
|
||||
@@ -133,18 +133,18 @@
|
||||
|
||||
{#if prompt.charAt(0) === '@'}
|
||||
{#if filteredModels.length > 0}
|
||||
<div class="md:px-2 mb-3 text-left w-full absolute bottom-0 left-0 right-0">
|
||||
<div class="pl-1 pr-12 mb-3 text-left w-full absolute bottom-0 left-0 right-0">
|
||||
<div class="flex w-full px-2">
|
||||
<div class=" bg-gray-100 dark:bg-gray-700 w-10 rounded-l-xl text-center">
|
||||
<div class=" text-lg font-semibold mt-2">@</div>
|
||||
</div>
|
||||
|
||||
<div class="max-h-60 flex flex-col w-full rounded-r-xl bg-white">
|
||||
<div class="max-h-60 flex flex-col w-full rounded-r-xl bg-white dark:bg-gray-850">
|
||||
<div class="m-1 overflow-y-auto p-1 rounded-r-xl space-y-0.5">
|
||||
{#each filteredModels as model, modelIdx}
|
||||
<button
|
||||
class=" px-3 py-1.5 rounded-xl w-full text-left {modelIdx === selectedIdx
|
||||
? ' bg-gray-100 selected-command-option-button'
|
||||
? ' bg-gray-100 dark:bg-gray-600 selected-command-option-button'
|
||||
: ''}"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
@@ -155,7 +155,7 @@
|
||||
}}
|
||||
on:focus={() => {}}
|
||||
>
|
||||
<div class=" font-medium text-black line-clamp-1">
|
||||
<div class=" font-medium text-black dark:text-gray-100 line-clamp-1">
|
||||
{model.name}
|
||||
</div>
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let files;
|
||||
export let prompt = '';
|
||||
let selectedCommandIdx = 0;
|
||||
let filteredPromptCommands = [];
|
||||
@@ -35,6 +36,32 @@
|
||||
return '{{CLIPBOARD}}';
|
||||
});
|
||||
|
||||
console.log(clipboardText);
|
||||
|
||||
const clipboardItems = await navigator.clipboard.read();
|
||||
|
||||
let imageUrl = null;
|
||||
for (const item of clipboardItems) {
|
||||
// Check for known image types
|
||||
for (const type of item.types) {
|
||||
if (type.startsWith('image/')) {
|
||||
const blob = await item.getType(type);
|
||||
imageUrl = URL.createObjectURL(blob);
|
||||
console.log(`Image URL (${type}): ${imageUrl}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (imageUrl) {
|
||||
files = [
|
||||
...files,
|
||||
{
|
||||
type: 'image',
|
||||
url: imageUrl
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
text = command.content.replaceAll('{{CLIPBOARD}}', clipboardText);
|
||||
}
|
||||
|
||||
@@ -61,18 +88,18 @@
|
||||
</script>
|
||||
|
||||
{#if filteredPromptCommands.length > 0}
|
||||
<div class="md:px-2 mb-3 text-left w-full absolute bottom-0 left-0 right-0">
|
||||
<div class="pl-1 pr-12 mb-3 text-left w-full absolute bottom-0 left-0 right-0">
|
||||
<div class="flex w-full px-2">
|
||||
<div class=" bg-gray-100 dark:bg-gray-700 w-10 rounded-l-xl text-center">
|
||||
<div class=" text-lg font-semibold mt-2">/</div>
|
||||
</div>
|
||||
|
||||
<div class="max-h-60 flex flex-col w-full rounded-r-xl bg-white">
|
||||
<div class="max-h-60 flex flex-col w-full rounded-r-xl bg-white dark:bg-gray-850">
|
||||
<div class="m-1 overflow-y-auto p-1 rounded-r-xl space-y-0.5">
|
||||
{#each filteredPromptCommands as command, commandIdx}
|
||||
<button
|
||||
class=" px-3 py-1.5 rounded-xl w-full text-left {commandIdx === selectedCommandIdx
|
||||
? ' bg-gray-100 selected-command-option-button'
|
||||
? ' bg-gray-100 dark:bg-gray-600 selected-command-option-button'
|
||||
: ''}"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
@@ -83,11 +110,11 @@
|
||||
}}
|
||||
on:focus={() => {}}
|
||||
>
|
||||
<div class=" font-medium text-black">
|
||||
<div class=" font-medium text-black dark:text-gray-100">
|
||||
{command.command}
|
||||
</div>
|
||||
|
||||
<div class=" text-xs text-gray-600">
|
||||
<div class=" text-xs text-gray-600 dark:text-gray-100">
|
||||
{command.title}
|
||||
</div>
|
||||
</button>
|
||||
@@ -95,7 +122,7 @@
|
||||
</div>
|
||||
|
||||
<div
|
||||
class=" px-2 pb-1 text-xs text-gray-600 bg-white rounded-br-xl flex items-center space-x-1"
|
||||
class=" px-2 pb-1 text-xs text-gray-600 dark:text-gray-100 bg-white dark:bg-gray-850 rounded-br-xl flex items-center space-x-1"
|
||||
>
|
||||
<div>
|
||||
<svg
|
||||
|
||||
@@ -0,0 +1,458 @@
|
||||
<script lang="ts">
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { createEventDispatcher, tick, getContext } from 'svelte';
|
||||
import { config, settings } from '$lib/stores';
|
||||
import { blobToFile, calculateSHA256, findWordIndices } from '$lib/utils';
|
||||
|
||||
import { transcribeAudio } from '$lib/apis/audio';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
export let recording = false;
|
||||
|
||||
let loading = false;
|
||||
let confirmed = false;
|
||||
|
||||
let durationSeconds = 0;
|
||||
let durationCounter = null;
|
||||
|
||||
let transcription = '';
|
||||
|
||||
const startDurationCounter = () => {
|
||||
durationCounter = setInterval(() => {
|
||||
durationSeconds++;
|
||||
}, 1000);
|
||||
};
|
||||
|
||||
const stopDurationCounter = () => {
|
||||
clearInterval(durationCounter);
|
||||
durationSeconds = 0;
|
||||
};
|
||||
|
||||
$: if (recording) {
|
||||
startRecording();
|
||||
} else {
|
||||
stopRecording();
|
||||
}
|
||||
|
||||
const formatSeconds = (seconds) => {
|
||||
const minutes = Math.floor(seconds / 60);
|
||||
const remainingSeconds = seconds % 60;
|
||||
const formattedSeconds = remainingSeconds < 10 ? `0${remainingSeconds}` : remainingSeconds;
|
||||
return `${minutes}:${formattedSeconds}`;
|
||||
};
|
||||
|
||||
let speechRecognition;
|
||||
|
||||
let mediaRecorder;
|
||||
let audioChunks = [];
|
||||
|
||||
const MIN_DECIBELS = -45;
|
||||
const VISUALIZER_BUFFER_LENGTH = 300;
|
||||
|
||||
let visualizerData = Array(VISUALIZER_BUFFER_LENGTH).fill(0);
|
||||
|
||||
// Function to calculate the RMS level from time domain data
|
||||
const calculateRMS = (data: Uint8Array) => {
|
||||
let sumSquares = 0;
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
const normalizedValue = (data[i] - 128) / 128; // Normalize the data
|
||||
sumSquares += normalizedValue * normalizedValue;
|
||||
}
|
||||
return Math.sqrt(sumSquares / data.length);
|
||||
};
|
||||
|
||||
const normalizeRMS = (rms) => {
|
||||
rms = rms * 10;
|
||||
const exp = 1.5; // Adjust exponent value; values greater than 1 expand larger numbers more and compress smaller numbers more
|
||||
const scaledRMS = Math.pow(rms, exp);
|
||||
|
||||
// Scale between 0.01 (1%) and 1.0 (100%)
|
||||
return Math.min(1.0, Math.max(0.01, scaledRMS));
|
||||
};
|
||||
|
||||
const analyseAudio = (stream) => {
|
||||
const audioContext = new AudioContext();
|
||||
const audioStreamSource = audioContext.createMediaStreamSource(stream);
|
||||
|
||||
const analyser = audioContext.createAnalyser();
|
||||
analyser.minDecibels = MIN_DECIBELS;
|
||||
audioStreamSource.connect(analyser);
|
||||
|
||||
const bufferLength = analyser.frequencyBinCount;
|
||||
|
||||
const domainData = new Uint8Array(bufferLength);
|
||||
const timeDomainData = new Uint8Array(analyser.fftSize);
|
||||
|
||||
let lastSoundTime = Date.now();
|
||||
|
||||
const detectSound = () => {
|
||||
const processFrame = () => {
|
||||
if (!recording || loading) return;
|
||||
|
||||
if (recording && !loading) {
|
||||
analyser.getByteTimeDomainData(timeDomainData);
|
||||
analyser.getByteFrequencyData(domainData);
|
||||
|
||||
// Calculate RMS level from time domain data
|
||||
const rmsLevel = calculateRMS(timeDomainData);
|
||||
// Push the calculated decibel level to visualizerData
|
||||
visualizerData.push(normalizeRMS(rmsLevel));
|
||||
|
||||
// Ensure visualizerData array stays within the buffer length
|
||||
if (visualizerData.length >= VISUALIZER_BUFFER_LENGTH) {
|
||||
visualizerData.shift();
|
||||
}
|
||||
|
||||
visualizerData = visualizerData;
|
||||
|
||||
// if (domainData.some((value) => value > 0)) {
|
||||
// lastSoundTime = Date.now();
|
||||
// }
|
||||
|
||||
// if (recording && Date.now() - lastSoundTime > 3000) {
|
||||
// if ($settings?.speechAutoSend ?? false) {
|
||||
// confirmRecording();
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
window.requestAnimationFrame(processFrame);
|
||||
};
|
||||
|
||||
window.requestAnimationFrame(processFrame);
|
||||
};
|
||||
|
||||
detectSound();
|
||||
};
|
||||
|
||||
const transcribeHandler = async (audioBlob) => {
|
||||
// Create a blob from the audio chunks
|
||||
|
||||
await tick();
|
||||
const file = blobToFile(audioBlob, 'recording.wav');
|
||||
|
||||
const res = await transcribeAudio(localStorage.token, file).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
console.log(res.text);
|
||||
dispatch('confirm', res.text);
|
||||
}
|
||||
};
|
||||
|
||||
const saveRecording = (blob) => {
|
||||
const url = URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
document.body.appendChild(a);
|
||||
a.style = 'display: none';
|
||||
a.href = url;
|
||||
a.download = 'recording.wav';
|
||||
a.click();
|
||||
window.URL.revokeObjectURL(url);
|
||||
};
|
||||
|
||||
const startRecording = async () => {
|
||||
startDurationCounter();
|
||||
|
||||
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
||||
mediaRecorder = new MediaRecorder(stream);
|
||||
mediaRecorder.onstart = () => {
|
||||
console.log('Recording started');
|
||||
audioChunks = [];
|
||||
analyseAudio(stream);
|
||||
};
|
||||
mediaRecorder.ondataavailable = (event) => audioChunks.push(event.data);
|
||||
mediaRecorder.onstop = async () => {
|
||||
console.log('Recording stopped');
|
||||
if (($settings?.audio?.stt?.engine ?? '') === 'web') {
|
||||
audioChunks = [];
|
||||
} else {
|
||||
if (confirmed) {
|
||||
const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
|
||||
|
||||
await transcribeHandler(audioBlob);
|
||||
|
||||
confirmed = false;
|
||||
loading = false;
|
||||
}
|
||||
audioChunks = [];
|
||||
recording = false;
|
||||
}
|
||||
};
|
||||
mediaRecorder.start();
|
||||
if ($config.audio.stt.engine === 'web' || ($settings?.audio?.stt?.engine ?? '') === 'web') {
|
||||
if ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window) {
|
||||
// Create a SpeechRecognition object
|
||||
speechRecognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
|
||||
|
||||
// Set continuous to true for continuous recognition
|
||||
speechRecognition.continuous = true;
|
||||
|
||||
// Set the timeout for turning off the recognition after inactivity (in milliseconds)
|
||||
const inactivityTimeout = 2000; // 3 seconds
|
||||
|
||||
let timeoutId;
|
||||
// Start recognition
|
||||
speechRecognition.start();
|
||||
|
||||
// Event triggered when speech is recognized
|
||||
speechRecognition.onresult = async (event) => {
|
||||
// Clear the inactivity timeout
|
||||
clearTimeout(timeoutId);
|
||||
|
||||
// Handle recognized speech
|
||||
console.log(event);
|
||||
const transcript = event.results[Object.keys(event.results).length - 1][0].transcript;
|
||||
|
||||
transcription = `${transcription}${transcript}`;
|
||||
|
||||
await tick();
|
||||
document.getElementById('chat-textarea')?.focus();
|
||||
|
||||
// Restart the inactivity timeout
|
||||
timeoutId = setTimeout(() => {
|
||||
console.log('Speech recognition turned off due to inactivity.');
|
||||
speechRecognition.stop();
|
||||
}, inactivityTimeout);
|
||||
};
|
||||
|
||||
// Event triggered when recognition is ended
|
||||
speechRecognition.onend = function () {
|
||||
// Restart recognition after it ends
|
||||
console.log('recognition ended');
|
||||
|
||||
confirmRecording();
|
||||
dispatch('confirm', transcription);
|
||||
|
||||
confirmed = false;
|
||||
loading = false;
|
||||
};
|
||||
|
||||
// Event triggered when an error occurs
|
||||
speechRecognition.onerror = function (event) {
|
||||
console.log(event);
|
||||
toast.error($i18n.t(`Speech recognition error: {{error}}`, { error: event.error }));
|
||||
dispatch('cancel');
|
||||
|
||||
stopRecording();
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const stopRecording = async () => {
|
||||
if (recording && mediaRecorder) {
|
||||
await mediaRecorder.stop();
|
||||
}
|
||||
stopDurationCounter();
|
||||
audioChunks = [];
|
||||
};
|
||||
|
||||
const confirmRecording = async () => {
|
||||
loading = true;
|
||||
confirmed = true;
|
||||
|
||||
if (recording && mediaRecorder) {
|
||||
await mediaRecorder.stop();
|
||||
}
|
||||
clearInterval(durationCounter);
|
||||
};
|
||||
</script>
|
||||
|
||||
<div
|
||||
class="{loading
|
||||
? ' bg-gray-100/50 dark:bg-gray-850/50'
|
||||
: 'bg-indigo-300/10 dark:bg-indigo-500/10 '} rounded-full flex p-2.5"
|
||||
>
|
||||
<div class="flex items-center mr-1">
|
||||
<button
|
||||
type="button"
|
||||
class="p-1.5
|
||||
|
||||
{loading
|
||||
? ' bg-gray-200 dark:bg-gray-700/50'
|
||||
: 'bg-indigo-400/20 text-indigo-600 dark:text-indigo-300 '}
|
||||
|
||||
|
||||
rounded-full"
|
||||
on:click={async () => {
|
||||
dispatch('cancel');
|
||||
stopRecording();
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="3"
|
||||
stroke="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div
|
||||
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">
|
||||
{#each visualizerData.slice().reverse() as rms}
|
||||
<div
|
||||
class="w-[2px]
|
||||
|
||||
{loading
|
||||
? ' 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))}%;"
|
||||
/>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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"
|
||||
>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m4.5 12.75 6 6 9-13.5" />
|
||||
</svg>
|
||||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.visualizer {
|
||||
display: flex;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.visualizer-bar {
|
||||
width: 2px;
|
||||
background-color: #4a5aba; /* or whatever color you need */
|
||||
}
|
||||
</style>
|
||||
@@ -109,7 +109,7 @@
|
||||
class=" snap-center min-w-80 w-full max-w-full m-1 border {history.messages[
|
||||
currentMessageId
|
||||
].model === model
|
||||
? 'border-gray-100 dark:border-gray-700 border-[1.5px]'
|
||||
? 'border-gray-100 dark:border-gray-850 border-[1.5px]'
|
||||
: 'border-gray-50 dark:border-gray-850 '} transition p-5 rounded-3xl"
|
||||
on:click={() => {
|
||||
currentMessageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
<script lang="ts">
|
||||
import { WEBUI_BASE_URL } from '$lib/constants';
|
||||
import { marked } from 'marked';
|
||||
|
||||
import { config, user, models as _models } from '$lib/stores';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
|
||||
import { blur, fade } from 'svelte/transition';
|
||||
|
||||
import Suggestions from '../MessageInput/Suggestions.svelte';
|
||||
import { sanitizeResponseContent } from '$lib/utils';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -29,7 +32,7 @@
|
||||
</script>
|
||||
|
||||
{#key mounted}
|
||||
<div class="m-auto w-full max-w-6xl px-8 lg:px-24 pb-16">
|
||||
<div class="m-auto w-full max-w-6xl px-8 lg:px-24 pb-10">
|
||||
<div class="flex justify-start">
|
||||
<div class="flex -space-x-4 mb-1" in:fade={{ duration: 200 }}>
|
||||
{#each models as model, modelIdx}
|
||||
@@ -65,8 +68,12 @@
|
||||
|
||||
<div in:fade={{ duration: 200, delay: 200 }}>
|
||||
{#if models[selectedModelIdx]?.info?.meta?.description ?? null}
|
||||
<div class="mt-0.5 text-base font-normal text-gray-500 dark:text-gray-400 line-clamp-3">
|
||||
{models[selectedModelIdx]?.info?.meta?.description}
|
||||
<div
|
||||
class="mt-0.5 text-base font-normal text-gray-500 dark:text-gray-400 line-clamp-3 markdown"
|
||||
>
|
||||
{@html marked.parse(
|
||||
sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description)
|
||||
)}
|
||||
</div>
|
||||
{#if models[selectedModelIdx]?.info?.meta?.user}
|
||||
<div class="mt-0.5 text-sm font-normal text-gray-400 dark:text-gray-500">
|
||||
@@ -85,7 +92,7 @@
|
||||
</div>
|
||||
{/if}
|
||||
{:else}
|
||||
<div class=" font-medium text-gray-400 dark:text-gray-500">
|
||||
<div class=" font-medium text-gray-400 dark:text-gray-500 line-clamp-1">
|
||||
{$i18n.t('How can I help you today?')}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -46,8 +46,8 @@
|
||||
}
|
||||
|
||||
onMount(() => {
|
||||
selectedReason = message.annotation.reason;
|
||||
comment = message.annotation.comment;
|
||||
selectedReason = message?.annotation?.reason ?? '';
|
||||
comment = message?.annotation?.comment ?? '';
|
||||
loadReasons();
|
||||
});
|
||||
|
||||
|
||||
@@ -211,82 +211,98 @@
|
||||
speaking = null;
|
||||
speakingIdx = null;
|
||||
} else {
|
||||
speaking = true;
|
||||
if ((message?.content ?? '').trim() !== '') {
|
||||
speaking = true;
|
||||
|
||||
if ($settings?.audio?.TTSEngine === 'openai') {
|
||||
loadingSpeech = true;
|
||||
if ($config.audio.tts.engine === 'openai') {
|
||||
loadingSpeech = true;
|
||||
|
||||
const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => {
|
||||
const lastIndex = mergedTexts.length - 1;
|
||||
if (lastIndex >= 0) {
|
||||
const previousText = mergedTexts[lastIndex];
|
||||
const wordCount = previousText.split(/\s+/).length;
|
||||
if (wordCount < 2) {
|
||||
mergedTexts[lastIndex] = previousText + ' ' + currentText;
|
||||
const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => {
|
||||
const lastIndex = mergedTexts.length - 1;
|
||||
if (lastIndex >= 0) {
|
||||
const previousText = mergedTexts[lastIndex];
|
||||
const wordCount = previousText.split(/\s+/).length;
|
||||
if (wordCount < 2) {
|
||||
mergedTexts[lastIndex] = previousText + ' ' + currentText;
|
||||
} else {
|
||||
mergedTexts.push(currentText);
|
||||
}
|
||||
} else {
|
||||
mergedTexts.push(currentText);
|
||||
}
|
||||
} else {
|
||||
mergedTexts.push(currentText);
|
||||
return mergedTexts;
|
||||
}, []);
|
||||
|
||||
console.log(sentences);
|
||||
|
||||
sentencesAudio = sentences.reduce((a, e, i, arr) => {
|
||||
a[i] = null;
|
||||
return a;
|
||||
}, {});
|
||||
|
||||
let lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately
|
||||
|
||||
for (const [idx, sentence] of sentences.entries()) {
|
||||
const res = await synthesizeOpenAISpeech(
|
||||
localStorage.token,
|
||||
$settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice,
|
||||
sentence
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
|
||||
speaking = null;
|
||||
loadingSpeech = false;
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
const blob = await res.blob();
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
const audio = new Audio(blobUrl);
|
||||
sentencesAudio[idx] = audio;
|
||||
loadingSpeech = false;
|
||||
lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx));
|
||||
}
|
||||
}
|
||||
return mergedTexts;
|
||||
}, []);
|
||||
} else {
|
||||
let voices = [];
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
if (voices.length > 0) {
|
||||
clearInterval(getVoicesLoop);
|
||||
|
||||
console.log(sentences);
|
||||
const voice =
|
||||
voices
|
||||
?.filter(
|
||||
(v) =>
|
||||
v.voiceURI === ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice)
|
||||
)
|
||||
?.at(0) ?? undefined;
|
||||
|
||||
sentencesAudio = sentences.reduce((a, e, i, arr) => {
|
||||
a[i] = null;
|
||||
return a;
|
||||
}, {});
|
||||
console.log(voice);
|
||||
|
||||
let lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately
|
||||
const speak = new SpeechSynthesisUtterance(message.content);
|
||||
|
||||
for (const [idx, sentence] of sentences.entries()) {
|
||||
const res = await synthesizeOpenAISpeech(
|
||||
localStorage.token,
|
||||
$settings?.audio?.speaker,
|
||||
sentence,
|
||||
$settings?.audio?.model
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
console.log(speak);
|
||||
|
||||
speaking = null;
|
||||
loadingSpeech = false;
|
||||
speak.onend = () => {
|
||||
speaking = null;
|
||||
if ($settings.conversationMode) {
|
||||
document.getElementById('voice-input-button')?.click();
|
||||
}
|
||||
};
|
||||
|
||||
return null;
|
||||
});
|
||||
if (voice) {
|
||||
speak.voice = voice;
|
||||
}
|
||||
|
||||
if (res) {
|
||||
const blob = await res.blob();
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
const audio = new Audio(blobUrl);
|
||||
sentencesAudio[idx] = audio;
|
||||
loadingSpeech = false;
|
||||
lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx));
|
||||
}
|
||||
speechSynthesis.speak(speak);
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
} else {
|
||||
let voices = [];
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
if (voices.length > 0) {
|
||||
clearInterval(getVoicesLoop);
|
||||
|
||||
const voice =
|
||||
voices?.filter((v) => v.name === $settings?.audio?.speaker)?.at(0) ?? undefined;
|
||||
|
||||
const speak = new SpeechSynthesisUtterance(message.content);
|
||||
|
||||
speak.onend = () => {
|
||||
speaking = null;
|
||||
if ($settings.conversationMode) {
|
||||
document.getElementById('voice-input-button')?.click();
|
||||
}
|
||||
};
|
||||
speak.voice = voice;
|
||||
speechSynthesis.speak(speak);
|
||||
}
|
||||
}, 100);
|
||||
toast.error('No content to speak');
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -404,26 +420,29 @@
|
||||
class="prose chat-{message.role} w-full max-w-full dark:prose-invert prose-headings:my-0 prose-headings:-mb-4 prose-p:m-0 prose-p:-mb-6 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-img:my-0 prose-ul:-my-4 prose-ol:-my-4 prose-li:-my-3 prose-ul:-mb-6 prose-ol:-mb-8 prose-ol:p-0 prose-li:-mb-4 whitespace-pre-line"
|
||||
>
|
||||
<div>
|
||||
{#if message?.status}
|
||||
{#if (message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]).length > 0}
|
||||
{@const status = (
|
||||
message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]
|
||||
).at(-1)}
|
||||
<div class="flex items-center gap-2 pt-1 pb-1">
|
||||
{#if message?.status?.done === false}
|
||||
{#if status.done === false}
|
||||
<div class="">
|
||||
<Spinner className="size-4" />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if message?.status?.action === 'web_search' && message?.status?.urls}
|
||||
<WebSearchResults urls={message?.status?.urls}>
|
||||
{#if status?.action === 'web_search' && status?.urls}
|
||||
<WebSearchResults {status}>
|
||||
<div class="flex flex-col justify-center -space-y-0.5">
|
||||
<div class="text-base line-clamp-1 text-wrap">
|
||||
{message.status.description}
|
||||
{status?.description}
|
||||
</div>
|
||||
</div>
|
||||
</WebSearchResults>
|
||||
{:else}
|
||||
<div class="flex flex-col justify-center -space-y-0.5">
|
||||
<div class=" text-gray-500 dark:text-gray-500 text-base line-clamp-1 text-wrap">
|
||||
{message.status.description}
|
||||
{status?.description}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
@@ -757,7 +776,7 @@
|
||||
</Tooltip>
|
||||
|
||||
{#if $config?.features.enable_image_generation && !readOnly}
|
||||
<Tooltip content="Generate Image" placement="bottom">
|
||||
<Tooltip content={$i18n.t('Generate Image')} placement="bottom">
|
||||
<button
|
||||
class="{isLastMessage
|
||||
? 'visible'
|
||||
@@ -857,8 +876,8 @@
|
||||
<button
|
||||
class="{isLastMessage
|
||||
? 'visible'
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {message
|
||||
?.annotation?.rating === 1
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message
|
||||
?.annotation?.rating ?? null) === 1
|
||||
? 'bg-gray-100 dark:bg-gray-800'
|
||||
: ''} dark:hover:text-white hover:text-black transition"
|
||||
on:click={() => {
|
||||
@@ -892,8 +911,8 @@
|
||||
<button
|
||||
class="{isLastMessage
|
||||
? 'visible'
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {message
|
||||
?.annotation?.rating === -1
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message
|
||||
?.annotation?.rating ?? null) === -1
|
||||
? 'bg-gray-100 dark:bg-gray-800'
|
||||
: ''} dark:hover:text-white hover:text-black transition"
|
||||
on:click={() => {
|
||||
@@ -963,6 +982,7 @@
|
||||
? 'visible'
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button"
|
||||
on:click={() => {
|
||||
showRateComment = false;
|
||||
regenerateResponse(message);
|
||||
}}
|
||||
>
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
<script lang="ts">
|
||||
import ChevronDown from '$lib/components/icons/ChevronDown.svelte';
|
||||
import ChevronUp from '$lib/components/icons/ChevronUp.svelte';
|
||||
import MagnifyingGlass from '$lib/components/icons/MagnifyingGlass.svelte';
|
||||
import { Collapsible } from 'bits-ui';
|
||||
import { slide } from 'svelte/transition';
|
||||
|
||||
export let urls = [];
|
||||
export let status = { urls: [], query: '' };
|
||||
let state = false;
|
||||
</script>
|
||||
|
||||
@@ -27,11 +28,45 @@
|
||||
class=" text-sm border border-gray-300/30 dark:border-gray-700/50 rounded-xl"
|
||||
transition={slide}
|
||||
>
|
||||
{#each urls as url, urlIdx}
|
||||
{#if status?.query}
|
||||
<a
|
||||
href="https://www.google.com/search?q={status.query}"
|
||||
target="_blank"
|
||||
class="flex w-full items-center p-3 px-4 border-b border-gray-300/30 dark:border-gray-700/50 group/item justify-between font-normal text-gray-800 dark:text-gray-300 no-underline"
|
||||
>
|
||||
<div class="flex gap-2 items-center">
|
||||
<MagnifyingGlass />
|
||||
|
||||
<div class=" line-clamp-1">
|
||||
{status.query}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class=" ml-1 text-white dark:text-gray-900 group-hover/item:text-gray-600 dark:group-hover/item:text-white transition"
|
||||
>
|
||||
<!-- -->
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M4.22 11.78a.75.75 0 0 1 0-1.06L9.44 5.5H5.75a.75.75 0 0 1 0-1.5h5.5a.75.75 0 0 1 .75.75v5.5a.75.75 0 0 1-1.5 0V6.56l-5.22 5.22a.75.75 0 0 1-1.06 0Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
{#each status.urls as url, urlIdx}
|
||||
<a
|
||||
href={url}
|
||||
target="_blank"
|
||||
class="flex w-full items-center p-3 px-4 {urlIdx === urls.length - 1
|
||||
class="flex w-full items-center p-3 px-4 {urlIdx === status.urls.length - 1
|
||||
? ''
|
||||
: 'border-b border-gray-300/30 dark:border-gray-700/50'} group/item justify-between font-normal text-gray-800 dark:text-gray-300"
|
||||
>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<script lang="ts">
|
||||
import { DropdownMenu } from 'bits-ui';
|
||||
import { marked } from 'marked';
|
||||
|
||||
import { flyAndScale } from '$lib/utils/transitions';
|
||||
import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
|
||||
@@ -152,6 +153,7 @@
|
||||
|
||||
toast.error(error);
|
||||
// opts.callback({ success: false, error, modelName: opts.modelName });
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,7 +221,7 @@
|
||||
<DropdownMenu.Content
|
||||
class=" z-40 {$mobile
|
||||
? `w-full`
|
||||
: `${className}`} max-w-[calc(100vw-1rem)] justify-start rounded-xl bg-white dark:bg-gray-850 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-700/50 outline-none "
|
||||
: `${className}`} max-w-[calc(100vw-1rem)] justify-start rounded-xl bg-white dark:bg-gray-850 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-850/50 outline-none "
|
||||
transition={flyAndScale}
|
||||
side={$mobile ? 'bottom' : 'bottom-start'}
|
||||
sideOffset={4}
|
||||
@@ -265,7 +267,7 @@
|
||||
</div>
|
||||
{/if}
|
||||
<div class="flex items-center gap-2">
|
||||
<div class="flex items-center">
|
||||
<div class="flex items-center min-w-fit">
|
||||
<div class="line-clamp-1">
|
||||
{item.label}
|
||||
</div>
|
||||
@@ -332,9 +334,12 @@
|
||||
|
||||
{#if item.model?.info?.meta?.description}
|
||||
<Tooltip
|
||||
content={`${sanitizeResponseContent(
|
||||
item.model?.info?.meta?.description
|
||||
).replaceAll('\n', '<br>')}`}
|
||||
content={`${marked.parse(
|
||||
sanitizeResponseContent(item.model?.info?.meta?.description).replaceAll(
|
||||
'\n',
|
||||
'<br>'
|
||||
)
|
||||
)}`}
|
||||
>
|
||||
<div class="">
|
||||
<svg
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
</div>
|
||||
|
||||
{#if ollamaVersion}
|
||||
<hr class=" dark:border-gray-700" />
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Ollama Version')}</div>
|
||||
@@ -104,7 +104,7 @@
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<hr class=" dark:border-gray-700" />
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div class="flex space-x-1">
|
||||
<a href="https://discord.gg/5rJgQTnV4s" target="_blank">
|
||||
|
||||
@@ -234,7 +234,7 @@
|
||||
<UpdatePassword />
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-700 my-4" />
|
||||
<hr class=" dark:border-gray-850 my-4" />
|
||||
|
||||
<div class="flex justify-between items-center text-sm">
|
||||
<div class=" font-medium">{$i18n.t('API keys')}</div>
|
||||
|
||||
@@ -5,21 +5,25 @@
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let admin = false;
|
||||
|
||||
export let params = {
|
||||
// Advanced
|
||||
seed: 0,
|
||||
seed: null,
|
||||
stop: null,
|
||||
temperature: '',
|
||||
frequency_penalty: '',
|
||||
repeat_last_n: '',
|
||||
mirostat: '',
|
||||
mirostat_eta: '',
|
||||
mirostat_tau: '',
|
||||
top_k: '',
|
||||
top_p: '',
|
||||
tfs_z: '',
|
||||
num_ctx: '',
|
||||
max_tokens: '',
|
||||
temperature: null,
|
||||
frequency_penalty: null,
|
||||
repeat_last_n: null,
|
||||
mirostat: null,
|
||||
mirostat_eta: null,
|
||||
mirostat_tau: null,
|
||||
top_k: null,
|
||||
top_p: null,
|
||||
tfs_z: null,
|
||||
num_ctx: null,
|
||||
num_batch: null,
|
||||
num_keep: null,
|
||||
max_tokens: null,
|
||||
use_mmap: null,
|
||||
use_mlock: null,
|
||||
num_thread: null,
|
||||
@@ -112,10 +116,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.temperature = (params?.temperature ?? '') === '' ? 0.8 : '';
|
||||
params.temperature = (params?.temperature ?? null) === null ? 0.8 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.temperature ?? '') === ''}
|
||||
{#if (params?.temperature ?? null) === null}
|
||||
<span class="ml-2 self-center"> {$i18n.t('Default')} </span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
|
||||
@@ -123,7 +127,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.temperature ?? '') !== ''}
|
||||
{#if (params?.temperature ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -143,7 +147,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="1"
|
||||
step="0.05"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -158,10 +162,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.mirostat = (params?.mirostat ?? '') === '' ? 0 : '';
|
||||
params.mirostat = (params?.mirostat ?? null) === null ? 0 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.mirostat ?? '') === ''}
|
||||
{#if (params?.mirostat ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -169,7 +173,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.mirostat ?? '') !== ''}
|
||||
{#if (params?.mirostat ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -204,10 +208,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.mirostat_eta = (params?.mirostat_eta ?? '') === '' ? 0.1 : '';
|
||||
params.mirostat_eta = (params?.mirostat_eta ?? null) === null ? 0.1 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.mirostat_eta ?? '') === ''}
|
||||
{#if (params?.mirostat_eta ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -215,7 +219,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.mirostat_eta ?? '') !== ''}
|
||||
{#if (params?.mirostat_eta ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -235,7 +239,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="1"
|
||||
step="0.05"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -250,10 +254,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.mirostat_tau = (params?.mirostat_tau ?? '') === '' ? 5.0 : '';
|
||||
params.mirostat_tau = (params?.mirostat_tau ?? null) === null ? 5.0 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.mirostat_tau ?? '') === ''}
|
||||
{#if (params?.mirostat_tau ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -261,7 +265,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.mirostat_tau ?? '') !== ''}
|
||||
{#if (params?.mirostat_tau ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -281,7 +285,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="10"
|
||||
step="0.5"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -296,10 +300,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.top_k = (params?.top_k ?? '') === '' ? 40 : '';
|
||||
params.top_k = (params?.top_k ?? null) === null ? 40 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.top_k ?? '') === ''}
|
||||
{#if (params?.top_k ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -307,7 +311,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.top_k ?? '') !== ''}
|
||||
{#if (params?.top_k ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -327,7 +331,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="100"
|
||||
step="0.5"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -342,10 +346,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.top_p = (params?.top_p ?? '') === '' ? 0.9 : '';
|
||||
params.top_p = (params?.top_p ?? null) === null ? 0.9 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.top_p ?? '') === ''}
|
||||
{#if (params?.top_p ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -353,7 +357,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.top_p ?? '') !== ''}
|
||||
{#if (params?.top_p ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -373,7 +377,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="1"
|
||||
step="0.05"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -388,10 +392,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.frequency_penalty = (params?.frequency_penalty ?? '') === '' ? 1.1 : '';
|
||||
params.frequency_penalty = (params?.frequency_penalty ?? null) === null ? 1.1 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.frequency_penalty ?? '') === ''}
|
||||
{#if (params?.frequency_penalty ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -399,7 +403,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.frequency_penalty ?? '') !== ''}
|
||||
{#if (params?.frequency_penalty ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -419,7 +423,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="2"
|
||||
step="0.05"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -434,10 +438,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.repeat_last_n = (params?.repeat_last_n ?? '') === '' ? 64 : '';
|
||||
params.repeat_last_n = (params?.repeat_last_n ?? null) === null ? 64 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.repeat_last_n ?? '') === ''}
|
||||
{#if (params?.repeat_last_n ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -445,7 +449,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.repeat_last_n ?? '') !== ''}
|
||||
{#if (params?.repeat_last_n ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -480,10 +484,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.tfs_z = (params?.tfs_z ?? '') === '' ? 1 : '';
|
||||
params.tfs_z = (params?.tfs_z ?? null) === null ? 1 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.tfs_z ?? '') === ''}
|
||||
{#if (params?.tfs_z ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -491,7 +495,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.tfs_z ?? '') !== ''}
|
||||
{#if (params?.tfs_z ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -511,7 +515,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="2"
|
||||
step="0.05"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -526,10 +530,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.num_ctx = (params?.num_ctx ?? '') === '' ? 2048 : '';
|
||||
params.num_ctx = (params?.num_ctx ?? null) === null ? 2048 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.num_ctx ?? '') === ''}
|
||||
{#if (params?.num_ctx ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -537,7 +541,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.num_ctx ?? '') !== ''}
|
||||
{#if (params?.num_ctx ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -556,7 +560,99 @@
|
||||
type="number"
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="-1"
|
||||
step="10"
|
||||
step="1"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Batch Size (num_batch)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.num_batch = (params?.num_batch ?? null) === null ? 512 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.num_batch ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.num_batch ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
id="steps-range"
|
||||
type="range"
|
||||
min="256"
|
||||
max="8192"
|
||||
step="256"
|
||||
bind:value={params.num_batch}
|
||||
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
|
||||
/>
|
||||
</div>
|
||||
<div class="">
|
||||
<input
|
||||
bind:value={params.num_batch}
|
||||
type="number"
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="256"
|
||||
step="256"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Tokens To Keep On Context Refresh (num_keep)')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.num_keep = (params?.num_keep ?? null) === null ? 24 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.num_keep ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.num_keep ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
id="steps-range"
|
||||
type="range"
|
||||
min="-1"
|
||||
max="10240000"
|
||||
step="1"
|
||||
bind:value={params.num_keep}
|
||||
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
|
||||
/>
|
||||
</div>
|
||||
<div class="">
|
||||
<input
|
||||
bind:value={params.num_keep}
|
||||
type="number"
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="-1"
|
||||
step="1"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -571,10 +667,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.max_tokens = (params?.max_tokens ?? '') === '' ? 128 : '';
|
||||
params.max_tokens = (params?.max_tokens ?? null) === null ? 128 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.max_tokens ?? '') === ''}
|
||||
{#if (params?.max_tokens ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -582,7 +678,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.max_tokens ?? '') !== ''}
|
||||
{#if (params?.max_tokens ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -609,122 +705,124 @@
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('use_mmap (Ollama)')}</div>
|
||||
{#if admin}
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('use_mmap (Ollama)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.use_mmap = (params?.use_mmap ?? null) === null ? true : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.use_mmap ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('use_mlock (Ollama)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.use_mlock = (params?.use_mlock ?? null) === null ? true : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.use_mlock ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('num_thread (Ollama)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.num_thread = (params?.num_thread ?? null) === null ? 2 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.num_thread ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.num_thread ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
id="steps-range"
|
||||
type="range"
|
||||
min="1"
|
||||
max="256"
|
||||
step="1"
|
||||
bind:value={params.num_thread}
|
||||
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
|
||||
/>
|
||||
</div>
|
||||
<div class="">
|
||||
<input
|
||||
bind:value={params.num_thread}
|
||||
type="number"
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="1"
|
||||
max="256"
|
||||
step="1"
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.use_mmap = (params?.use_mmap ?? null) === null ? true : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.use_mmap ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Template')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.template = (params?.template ?? null) === null ? '' : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.template ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.template ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<textarea
|
||||
class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
|
||||
placeholder="Write your model template content here"
|
||||
rows="4"
|
||||
bind:value={params.template}
|
||||
/>
|
||||
</div>
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('use_mlock (Ollama)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.use_mlock = (params?.use_mlock ?? null) === null ? true : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.use_mlock ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('num_thread (Ollama)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.num_thread = (params?.num_thread ?? null) === null ? 2 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.num_thread ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.num_thread ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
id="steps-range"
|
||||
type="range"
|
||||
min="1"
|
||||
max="256"
|
||||
step="1"
|
||||
bind:value={params.num_thread}
|
||||
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
|
||||
/>
|
||||
</div>
|
||||
<div class="">
|
||||
<input
|
||||
bind:value={params.num_thread}
|
||||
type="number"
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="1"
|
||||
max="256"
|
||||
step="1"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<!-- <div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Template')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.template = (params?.template ?? null) === null ? '' : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.template ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.template ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<textarea
|
||||
class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
|
||||
placeholder="Write your model template content here"
|
||||
rows="4"
|
||||
bind:value={params.template}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div> -->
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<script lang="ts">
|
||||
import { getAudioConfig, updateAudioConfig } from '$lib/apis/audio';
|
||||
import { user, settings } from '$lib/stores';
|
||||
import { user, settings, config } from '$lib/stores';
|
||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
@@ -11,26 +10,15 @@
|
||||
export let saveSettings: Function;
|
||||
|
||||
// Audio
|
||||
|
||||
let OpenAIUrl = '';
|
||||
let OpenAIKey = '';
|
||||
let OpenAISpeaker = '';
|
||||
|
||||
let STTEngines = ['', 'openai'];
|
||||
let STTEngine = '';
|
||||
|
||||
let conversationMode = false;
|
||||
let speechAutoSend = false;
|
||||
let responseAutoPlayback = false;
|
||||
let nonLocalVoices = false;
|
||||
|
||||
let TTSEngines = ['', 'openai'];
|
||||
let TTSEngine = '';
|
||||
let STTEngine = '';
|
||||
|
||||
let voices = [];
|
||||
let speaker = '';
|
||||
let models = [];
|
||||
let model = '';
|
||||
let voice = '';
|
||||
|
||||
const getOpenAIVoices = () => {
|
||||
voices = [
|
||||
@@ -43,10 +31,6 @@
|
||||
];
|
||||
};
|
||||
|
||||
const getOpenAIVoicesModel = () => {
|
||||
models = [{ name: 'tts-1' }, { name: 'tts-1-hd' }];
|
||||
};
|
||||
|
||||
const getWebAPIVoices = () => {
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
@@ -58,21 +42,6 @@
|
||||
}, 100);
|
||||
};
|
||||
|
||||
const toggleConversationMode = async () => {
|
||||
conversationMode = !conversationMode;
|
||||
|
||||
if (conversationMode) {
|
||||
responseAutoPlayback = true;
|
||||
speechAutoSend = true;
|
||||
}
|
||||
|
||||
saveSettings({
|
||||
conversationMode: conversationMode,
|
||||
responseAutoPlayback: responseAutoPlayback,
|
||||
speechAutoSend: speechAutoSend
|
||||
});
|
||||
};
|
||||
|
||||
const toggleResponseAutoPlayback = async () => {
|
||||
responseAutoPlayback = !responseAutoPlayback;
|
||||
saveSettings({ responseAutoPlayback: responseAutoPlayback });
|
||||
@@ -83,76 +52,35 @@
|
||||
saveSettings({ speechAutoSend: speechAutoSend });
|
||||
};
|
||||
|
||||
const updateConfigHandler = async () => {
|
||||
if (TTSEngine === 'openai') {
|
||||
const res = await updateAudioConfig(localStorage.token, {
|
||||
url: OpenAIUrl,
|
||||
key: OpenAIKey,
|
||||
model: model,
|
||||
speaker: OpenAISpeaker
|
||||
});
|
||||
|
||||
if (res) {
|
||||
OpenAIUrl = res.OPENAI_API_BASE_URL;
|
||||
OpenAIKey = res.OPENAI_API_KEY;
|
||||
model = res.OPENAI_API_MODEL;
|
||||
OpenAISpeaker = res.OPENAI_API_VOICE;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
conversationMode = $settings.conversationMode ?? false;
|
||||
speechAutoSend = $settings.speechAutoSend ?? false;
|
||||
responseAutoPlayback = $settings.responseAutoPlayback ?? false;
|
||||
|
||||
STTEngine = $settings?.audio?.STTEngine ?? '';
|
||||
TTSEngine = $settings?.audio?.TTSEngine ?? '';
|
||||
nonLocalVoices = $settings.audio?.nonLocalVoices ?? false;
|
||||
speaker = $settings?.audio?.speaker ?? '';
|
||||
model = $settings?.audio?.model ?? '';
|
||||
STTEngine = $settings?.audio?.stt?.engine ?? '';
|
||||
voice = $settings?.audio?.tts?.voice ?? $config.audio.tts.voice ?? '';
|
||||
nonLocalVoices = $settings.audio?.tts?.nonLocalVoices ?? false;
|
||||
|
||||
if (TTSEngine === 'openai') {
|
||||
if ($config.audio.tts.engine === 'openai') {
|
||||
getOpenAIVoices();
|
||||
getOpenAIVoicesModel();
|
||||
} else {
|
||||
getWebAPIVoices();
|
||||
}
|
||||
|
||||
if ($user.role === 'admin') {
|
||||
const res = await getAudioConfig(localStorage.token);
|
||||
|
||||
if (res) {
|
||||
OpenAIUrl = res.OPENAI_API_BASE_URL;
|
||||
OpenAIKey = res.OPENAI_API_KEY;
|
||||
model = res.OPENAI_API_MODEL;
|
||||
OpenAISpeaker = res.OPENAI_API_VOICE;
|
||||
if (TTSEngine === 'openai') {
|
||||
speaker = OpenAISpeaker;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<form
|
||||
class="flex flex-col h-full justify-between space-y-3 text-sm"
|
||||
on:submit|preventDefault={async () => {
|
||||
if ($user.role === 'admin') {
|
||||
await updateConfigHandler();
|
||||
}
|
||||
saveSettings({
|
||||
audio: {
|
||||
STTEngine: STTEngine !== '' ? STTEngine : undefined,
|
||||
TTSEngine: TTSEngine !== '' ? TTSEngine : undefined,
|
||||
speaker:
|
||||
(TTSEngine === 'openai' ? OpenAISpeaker : speaker) !== ''
|
||||
? TTSEngine === 'openai'
|
||||
? OpenAISpeaker
|
||||
: speaker
|
||||
: undefined,
|
||||
model: model !== '' ? model : undefined,
|
||||
nonLocalVoices: nonLocalVoices
|
||||
stt: {
|
||||
engine: STTEngine !== '' ? STTEngine : undefined
|
||||
},
|
||||
tts: {
|
||||
voice: voice !== '' ? voice : undefined,
|
||||
nonLocalVoices: $config.audio.tts.engine === '' ? nonLocalVoices : undefined
|
||||
}
|
||||
}
|
||||
});
|
||||
dispatch('save');
|
||||
@@ -162,53 +90,25 @@
|
||||
<div>
|
||||
<div class=" mb-1 text-sm font-medium">{$i18n.t('STT Settings')}</div>
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Speech-to-Text Engine')}</div>
|
||||
<div class="flex items-center relative">
|
||||
<select
|
||||
class="dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={STTEngine}
|
||||
placeholder="Select a mode"
|
||||
on:change={(e) => {
|
||||
if (e.target.value !== '') {
|
||||
navigator.mediaDevices.getUserMedia({ audio: true }).catch(function (err) {
|
||||
toast.error(
|
||||
$i18n.t(`Permission denied when accessing microphone: {{error}}`, {
|
||||
error: err
|
||||
})
|
||||
);
|
||||
STTEngine = '';
|
||||
});
|
||||
}
|
||||
}}
|
||||
>
|
||||
<option value="">{$i18n.t('Default (Web API)')}</option>
|
||||
<option value="whisper-local">{$i18n.t('Whisper (Local)')}</option>
|
||||
</select>
|
||||
{#if $config.audio.stt.engine !== 'web'}
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Speech-to-Text Engine')}</div>
|
||||
<div class="flex items-center relative">
|
||||
<select
|
||||
class="dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={STTEngine}
|
||||
placeholder="Select an engine"
|
||||
>
|
||||
<option value="">{$i18n.t('Default')}</option>
|
||||
<option value="web">{$i18n.t('Web API')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Conversation Mode')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
on:click={() => {
|
||||
toggleConversationMode();
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{#if conversationMode === 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>
|
||||
{/if}
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Auto-send input after 3 sec.')}
|
||||
{$i18n.t('Instant Auto-Send After Voice Transcription')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
@@ -230,50 +130,6 @@
|
||||
<div>
|
||||
<div class=" mb-1 text-sm font-medium">{$i18n.t('TTS Settings')}</div>
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Text-to-Speech Engine')}</div>
|
||||
<div class="flex items-center relative">
|
||||
<select
|
||||
class=" dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={TTSEngine}
|
||||
placeholder="Select a mode"
|
||||
on:change={(e) => {
|
||||
if (e.target.value === 'openai') {
|
||||
getOpenAIVoices();
|
||||
OpenAISpeaker = 'alloy';
|
||||
model = 'tts-1';
|
||||
} else {
|
||||
getWebAPIVoices();
|
||||
speaker = '';
|
||||
}
|
||||
}}
|
||||
>
|
||||
<option value="">{$i18n.t('Default (Web API)')}</option>
|
||||
<option value="openai">{$i18n.t('Open AI')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if $user.role === 'admin'}
|
||||
{#if TTSEngine === 'openai'}
|
||||
<div class="mt-1 flex gap-2 mb-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('API Base URL')}
|
||||
bind:value={OpenAIUrl}
|
||||
required
|
||||
/>
|
||||
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={OpenAIKey}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Auto-playback response')}</div>
|
||||
|
||||
@@ -293,23 +149,23 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-700" />
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
{#if TTSEngine === ''}
|
||||
{#if $config.audio.tts.engine === ''}
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Voice')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={speaker}
|
||||
bind:value={voice}
|
||||
>
|
||||
<option value="" selected={speaker !== ''}>{$i18n.t('Default')}</option>
|
||||
{#each voices.filter((v) => nonLocalVoices || v.localService === true) as voice}
|
||||
<option value="" selected={voice !== ''}>{$i18n.t('Default')}</option>
|
||||
{#each voices.filter((v) => nonLocalVoices || v.localService === true) as _voice}
|
||||
<option
|
||||
value={voice.name}
|
||||
value={_voice.name}
|
||||
class="bg-gray-100 dark:bg-gray-700"
|
||||
selected={speaker === voice.name}>{voice.name}</option
|
||||
selected={voice === _voice.name}>{_voice.name}</option
|
||||
>
|
||||
{/each}
|
||||
</select>
|
||||
@@ -325,7 +181,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if TTSEngine === 'openai'}
|
||||
{:else if $config.audio.tts.engine === 'openai'}
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Voice')}</div>
|
||||
<div class="flex w-full">
|
||||
@@ -333,7 +189,7 @@
|
||||
<input
|
||||
list="voice-list"
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={OpenAISpeaker}
|
||||
bind:value={voice}
|
||||
placeholder="Select a voice"
|
||||
/>
|
||||
|
||||
@@ -345,25 +201,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Model')}</div>
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
list="model-list"
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={model}
|
||||
placeholder="Select a model"
|
||||
/>
|
||||
|
||||
<datalist id="model-list">
|
||||
{#each models as model}
|
||||
<option value={model.name} />
|
||||
{/each}
|
||||
</datalist>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-700" />
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div class="flex flex-col">
|
||||
<input
|
||||
@@ -218,7 +218,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-700" />
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div class="flex flex-col">
|
||||
{#if showArchiveConfirm}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import { getLanguages } from '$lib/i18n';
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
import { models, settings, theme } from '$lib/stores';
|
||||
import { models, settings, theme, user } from '$lib/stores';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -43,19 +43,21 @@
|
||||
|
||||
let params = {
|
||||
// Advanced
|
||||
seed: 0,
|
||||
temperature: '',
|
||||
frequency_penalty: '',
|
||||
repeat_last_n: '',
|
||||
mirostat: '',
|
||||
mirostat_eta: '',
|
||||
mirostat_tau: '',
|
||||
top_k: '',
|
||||
top_p: '',
|
||||
seed: null,
|
||||
temperature: null,
|
||||
frequency_penalty: null,
|
||||
repeat_last_n: null,
|
||||
mirostat: null,
|
||||
mirostat_eta: null,
|
||||
mirostat_tau: null,
|
||||
top_k: null,
|
||||
top_p: null,
|
||||
stop: null,
|
||||
tfs_z: '',
|
||||
num_ctx: '',
|
||||
max_tokens: ''
|
||||
tfs_z: null,
|
||||
num_ctx: null,
|
||||
num_batch: null,
|
||||
num_keep: null,
|
||||
max_tokens: null
|
||||
};
|
||||
|
||||
const toggleRequestFormat = async () => {
|
||||
@@ -79,12 +81,6 @@
|
||||
requestFormat = $settings.requestFormat ?? '';
|
||||
keepAlive = $settings.keepAlive ?? null;
|
||||
|
||||
params.seed = $settings.seed ?? 0;
|
||||
params.temperature = $settings.temperature ?? '';
|
||||
params.frequency_penalty = $settings.frequency_penalty ?? '';
|
||||
params.top_k = $settings.top_k ?? '';
|
||||
params.top_p = $settings.top_p ?? '';
|
||||
params.num_ctx = $settings.num_ctx ?? '';
|
||||
params = { ...params, ...$settings.params };
|
||||
params.stop = $settings?.params?.stop ? ($settings?.params?.stop ?? []).join(',') : null;
|
||||
});
|
||||
@@ -146,6 +142,7 @@
|
||||
<option value="dark">🌑 {$i18n.t('Dark')}</option>
|
||||
<option value="oled-dark">🌃 {$i18n.t('OLED Dark')}</option>
|
||||
<option value="light">☀️ {$i18n.t('Light')}</option>
|
||||
<option value="her">🌷 Her</option>
|
||||
<!-- <option value="rose-pine dark">🪻 {$i18n.t('Rosé Pine')}</option>
|
||||
<option value="rose-pine-dawn light">🌷 {$i18n.t('Rosé Pine Dawn')}</option> -->
|
||||
</select>
|
||||
@@ -203,7 +200,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-700 my-3" />
|
||||
<hr class=" dark:border-gray-850 my-3" />
|
||||
|
||||
<div>
|
||||
<div class=" my-2.5 text-sm font-medium">{$i18n.t('System Prompt')}</div>
|
||||
@@ -227,8 +224,8 @@
|
||||
</div>
|
||||
|
||||
{#if showAdvanced}
|
||||
<AdvancedParams bind:params />
|
||||
<hr class=" dark:border-gray-700" />
|
||||
<AdvancedParams admin={$user?.role === 'admin'} bind:params />
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div class=" py-1 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
@@ -300,20 +297,25 @@
|
||||
saveSettings({
|
||||
system: system !== '' ? system : undefined,
|
||||
params: {
|
||||
seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined,
|
||||
seed: (params.seed !== null ? params.seed : undefined) ?? undefined,
|
||||
stop: params.stop ? params.stop.split(',').filter((e) => e) : undefined,
|
||||
temperature: params.temperature !== '' ? params.temperature : undefined,
|
||||
temperature: params.temperature !== null ? params.temperature : undefined,
|
||||
frequency_penalty:
|
||||
params.frequency_penalty !== '' ? params.frequency_penalty : undefined,
|
||||
repeat_last_n: params.repeat_last_n !== '' ? params.repeat_last_n : undefined,
|
||||
mirostat: params.mirostat !== '' ? params.mirostat : undefined,
|
||||
mirostat_eta: params.mirostat_eta !== '' ? params.mirostat_eta : undefined,
|
||||
mirostat_tau: params.mirostat_tau !== '' ? params.mirostat_tau : undefined,
|
||||
top_k: params.top_k !== '' ? params.top_k : undefined,
|
||||
top_p: params.top_p !== '' ? params.top_p : undefined,
|
||||
tfs_z: params.tfs_z !== '' ? params.tfs_z : undefined,
|
||||
num_ctx: params.num_ctx !== '' ? params.num_ctx : undefined,
|
||||
max_tokens: params.max_tokens !== '' ? params.max_tokens : undefined
|
||||
params.frequency_penalty !== null ? params.frequency_penalty : undefined,
|
||||
repeat_last_n: params.repeat_last_n !== null ? params.repeat_last_n : undefined,
|
||||
mirostat: params.mirostat !== null ? params.mirostat : undefined,
|
||||
mirostat_eta: params.mirostat_eta !== null ? params.mirostat_eta : undefined,
|
||||
mirostat_tau: params.mirostat_tau !== null ? params.mirostat_tau : undefined,
|
||||
top_k: params.top_k !== null ? params.top_k : undefined,
|
||||
top_p: params.top_p !== null ? params.top_p : undefined,
|
||||
tfs_z: params.tfs_z !== null ? params.tfs_z : undefined,
|
||||
num_ctx: params.num_ctx !== null ? params.num_ctx : undefined,
|
||||
num_batch: params.num_batch !== null ? params.num_batch : undefined,
|
||||
num_keep: params.num_keep !== null ? params.num_keep : undefined,
|
||||
max_tokens: params.max_tokens !== null ? params.max_tokens : undefined,
|
||||
use_mmap: params.use_mmap !== null ? params.use_mmap : undefined,
|
||||
use_mlock: params.use_mlock !== null ? params.use_mlock : undefined,
|
||||
num_thread: params.num_thread !== null ? params.num_thread : undefined
|
||||
},
|
||||
keepAlive: keepAlive ? (isNaN(keepAlive) ? keepAlive : parseInt(keepAlive)) : undefined
|
||||
});
|
||||
|
||||
@@ -14,19 +14,18 @@
|
||||
// Addons
|
||||
let titleAutoGenerate = true;
|
||||
let responseAutoCopy = false;
|
||||
let titleAutoGenerateModel = '';
|
||||
let titleAutoGenerateModelExternal = '';
|
||||
let widescreenMode = false;
|
||||
let titleGenerationPrompt = '';
|
||||
let splitLargeChunks = false;
|
||||
|
||||
// Interface
|
||||
let defaultModelId = '';
|
||||
let promptSuggestions = [];
|
||||
let showUsername = false;
|
||||
|
||||
let chatBubble = true;
|
||||
let chatDirection: 'LTR' | 'RTL' = 'LTR';
|
||||
|
||||
let showEmojiInCall = false;
|
||||
|
||||
const toggleSplitLargeChunks = async () => {
|
||||
splitLargeChunks = !splitLargeChunks;
|
||||
saveSettings({ splitLargeChunks: splitLargeChunks });
|
||||
@@ -47,6 +46,11 @@
|
||||
saveSettings({ showUsername: showUsername });
|
||||
};
|
||||
|
||||
const toggleEmojiInCall = async () => {
|
||||
showEmojiInCall = !showEmojiInCall;
|
||||
saveSettings({ showEmojiInCall: showEmojiInCall });
|
||||
};
|
||||
|
||||
const toggleTitleAutoGenerate = async () => {
|
||||
titleAutoGenerate = !titleAutoGenerate;
|
||||
saveSettings({
|
||||
@@ -85,36 +89,19 @@
|
||||
};
|
||||
|
||||
const updateInterfaceHandler = async () => {
|
||||
if ($user.role === 'admin') {
|
||||
promptSuggestions = await setDefaultPromptSuggestions(localStorage.token, promptSuggestions);
|
||||
await config.set(await getBackendConfig());
|
||||
}
|
||||
|
||||
saveSettings({
|
||||
title: {
|
||||
...$settings.title,
|
||||
model: titleAutoGenerateModel !== '' ? titleAutoGenerateModel : undefined,
|
||||
modelExternal:
|
||||
titleAutoGenerateModelExternal !== '' ? titleAutoGenerateModelExternal : undefined,
|
||||
prompt: titleGenerationPrompt ? titleGenerationPrompt : undefined
|
||||
},
|
||||
models: [defaultModelId]
|
||||
});
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
if ($user.role === 'admin') {
|
||||
promptSuggestions = $config?.default_prompt_suggestions;
|
||||
}
|
||||
|
||||
titleAutoGenerate = $settings?.title?.auto ?? true;
|
||||
titleAutoGenerateModel = $settings?.title?.model ?? '';
|
||||
titleAutoGenerateModelExternal = $settings?.title?.modelExternal ?? '';
|
||||
titleGenerationPrompt =
|
||||
$settings?.title?.prompt ??
|
||||
`Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title': {{prompt}}`;
|
||||
|
||||
responseAutoCopy = $settings.responseAutoCopy ?? false;
|
||||
showUsername = $settings.showUsername ?? false;
|
||||
|
||||
showEmojiInCall = $settings.showEmojiInCall ?? false;
|
||||
|
||||
chatBubble = $settings.chatBubble ?? true;
|
||||
widescreenMode = $settings.widescreenMode ?? false;
|
||||
splitLargeChunks = $settings.splitLargeChunks ?? false;
|
||||
@@ -217,6 +204,26 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Display Emoji in Call')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
on:click={() => {
|
||||
toggleEmojiInCall();
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{#if showEmojiInCall === 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>
|
||||
|
||||
{#if !$settings.chatBubble}
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
@@ -304,162 +311,6 @@
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div>
|
||||
<div class=" mb-2.5 text-sm font-medium flex">
|
||||
<div class=" mr-1">{$i18n.t('Set Task Model')}</div>
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'A task model is used when performing tasks such as generating titles for chats and web search queries'
|
||||
)}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-5 h-5"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z"
|
||||
/>
|
||||
</svg>
|
||||
</Tooltip>
|
||||
</div>
|
||||
<div class="flex w-full gap-2 pr-2">
|
||||
<div class="flex-1">
|
||||
<div class=" text-xs mb-1">Local Models</div>
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={titleAutoGenerateModel}
|
||||
placeholder={$i18n.t('Select a model')}
|
||||
>
|
||||
<option value="" selected>{$i18n.t('Current Model')}</option>
|
||||
{#each $models.filter((m) => m.owned_by === 'ollama') as model}
|
||||
<option value={model.id} class="bg-gray-100 dark:bg-gray-700">
|
||||
{model.name}
|
||||
</option>
|
||||
{/each}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="flex-1">
|
||||
<div class=" text-xs mb-1">External Models</div>
|
||||
<select
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
bind:value={titleAutoGenerateModelExternal}
|
||||
placeholder={$i18n.t('Select a model')}
|
||||
>
|
||||
<option value="" selected>{$i18n.t('Current Model')}</option>
|
||||
{#each $models as model}
|
||||
<option value={model.id} class="bg-gray-100 dark:bg-gray-700">
|
||||
{model.name}
|
||||
</option>
|
||||
{/each}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-3 mr-2">
|
||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Title Generation Prompt')}</div>
|
||||
<textarea
|
||||
bind:value={titleGenerationPrompt}
|
||||
class="w-full rounded-lg p-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none resize-none"
|
||||
rows="3"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if $user.role === 'admin'}
|
||||
<hr class=" dark:border-gray-700" />
|
||||
|
||||
<div class=" space-y-3 pr-1.5">
|
||||
<div class="flex w-full justify-between mb-2">
|
||||
<div class=" self-center text-sm font-semibold">
|
||||
{$i18n.t('Default Prompt Suggestions')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
if (promptSuggestions.length === 0 || promptSuggestions.at(-1).content !== '') {
|
||||
promptSuggestions = [...promptSuggestions, { content: '', title: ['', ''] }];
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="flex flex-col space-y-1">
|
||||
{#each promptSuggestions as prompt, promptIdx}
|
||||
<div class=" flex border dark:border-gray-600 rounded-lg">
|
||||
<div class="flex flex-col flex-1">
|
||||
<div class="flex border-b dark:border-gray-600 w-full">
|
||||
<input
|
||||
class="px-3 py-1.5 text-xs w-full bg-transparent outline-none border-r dark:border-gray-600"
|
||||
placeholder={$i18n.t('Title (e.g. Tell me a fun fact)')}
|
||||
bind:value={prompt.title[0]}
|
||||
/>
|
||||
|
||||
<input
|
||||
class="px-3 py-1.5 text-xs w-full bg-transparent outline-none border-r dark:border-gray-600"
|
||||
placeholder={$i18n.t('Subtitle (e.g. about the Roman Empire)')}
|
||||
bind:value={prompt.title[1]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<input
|
||||
class="px-3 py-1.5 text-xs w-full bg-transparent outline-none border-r dark:border-gray-600"
|
||||
placeholder={$i18n.t('Prompt (e.g. Tell me a fun fact about the Roman Empire)')}
|
||||
bind:value={prompt.content}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="px-2"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
promptSuggestions.splice(promptIdx, 1);
|
||||
promptSuggestions = promptSuggestions;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
{#if promptSuggestions.length > 0}
|
||||
<div class="text-xs text-left w-full mt-2">
|
||||
{$i18n.t('Adjusting these settings will apply changes universally to all users.')}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end text-sm font-medium">
|
||||
|
||||
@@ -541,7 +541,7 @@
|
||||
]);
|
||||
} else {
|
||||
ollamaEnabled = false;
|
||||
toast.error('Ollama API is disabled');
|
||||
toast.error($i18n.t('Ollama API is disabled'));
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -1063,7 +1063,7 @@
|
||||
</div>
|
||||
{/if}
|
||||
{:else if ollamaEnabled === false}
|
||||
<div>Ollama API is disabled</div>
|
||||
<div>{$i18n.t('Ollama API is disabled')}</div>
|
||||
{:else}
|
||||
<div class="flex h-full justify-center">
|
||||
<div class="my-auto">
|
||||
|
||||
@@ -35,7 +35,9 @@
|
||||
<div>
|
||||
<div class="flex items-center justify-between mb-1">
|
||||
<Tooltip
|
||||
content="This is an experimental feature, it may not function as expected and is subject to change at any time."
|
||||
content={$i18n.t(
|
||||
'This is an experimental feature, it may not function as expected and is subject to change at any time.'
|
||||
)}
|
||||
>
|
||||
<div class="text-sm font-medium">
|
||||
{$i18n.t('Memory')}
|
||||
@@ -57,8 +59,9 @@
|
||||
|
||||
<div class="text-xs text-gray-600 dark:text-gray-400">
|
||||
<div>
|
||||
You can personalize your interactions with LLMs by adding memories through the 'Manage'
|
||||
button below, making them more helpful and tailored to you.
|
||||
{$i18n.t(
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you."
|
||||
)}
|
||||
</div>
|
||||
|
||||
<!-- <div class="mt-3">
|
||||
@@ -79,7 +82,7 @@
|
||||
showManageModal = true;
|
||||
}}
|
||||
>
|
||||
Manage
|
||||
{$i18n.t('Manage')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,13 +2,12 @@
|
||||
import { createEventDispatcher, getContext } from 'svelte';
|
||||
|
||||
import Modal from '$lib/components/common/Modal.svelte';
|
||||
import { addNewMemory } from '$lib/apis/memories';
|
||||
import { addNewMemory, updateMemoryById } from '$lib/apis/memories';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
export let show;
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let loading = false;
|
||||
@@ -38,7 +37,9 @@
|
||||
<Modal bind:show size="sm">
|
||||
<div>
|
||||
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2">
|
||||
<div class=" text-lg font-medium self-center">{$i18n.t('Add Memory')}</div>
|
||||
<div class=" text-lg font-medium self-center">
|
||||
{$i18n.t('Add Memory')}
|
||||
</div>
|
||||
<button
|
||||
class="self-center"
|
||||
on:click={() => {
|
||||
@@ -75,7 +76,7 @@
|
||||
/>
|
||||
|
||||
<div class="text-xs text-gray-500">
|
||||
ⓘ Refer to yourself as "User" (e.g., "User is learning Spanish")
|
||||
ⓘ {$i18n.t('Refer to yourself as "User" (e.g., "User is learning Spanish")')}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
<script>
|
||||
import { createEventDispatcher, getContext } from 'svelte';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
import { updateMemoryById } from '$lib/apis/memories';
|
||||
|
||||
import Modal from '$lib/components/common/Modal.svelte';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
export let show;
|
||||
export let memory = {};
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let loading = false;
|
||||
let content = '';
|
||||
|
||||
$: if (show) {
|
||||
setContent();
|
||||
}
|
||||
|
||||
const setContent = () => {
|
||||
content = memory.content;
|
||||
};
|
||||
|
||||
const submitHandler = async () => {
|
||||
loading = true;
|
||||
|
||||
const res = await updateMemoryById(localStorage.token, memory.id, content).catch((error) => {
|
||||
toast.error(error);
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
console.log(res);
|
||||
toast.success('Memory updated successfully');
|
||||
dispatch('save');
|
||||
show = false;
|
||||
}
|
||||
|
||||
loading = false;
|
||||
};
|
||||
</script>
|
||||
|
||||
<Modal bind:show size="sm">
|
||||
<div>
|
||||
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2">
|
||||
<div class=" text-lg font-medium self-center">
|
||||
{$i18n.t('Edit Memory')}
|
||||
</div>
|
||||
<button
|
||||
class="self-center"
|
||||
on:click={() => {
|
||||
show = false;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-5 h-5"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 dark:text-gray-200">
|
||||
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
|
||||
<form
|
||||
class="flex flex-col w-full"
|
||||
on:submit|preventDefault={() => {
|
||||
submitHandler();
|
||||
}}
|
||||
>
|
||||
<div class="">
|
||||
<textarea
|
||||
bind:value={content}
|
||||
class=" bg-transparent w-full text-sm resize-none rounded-xl p-3 outline outline-1 outline-gray-100 dark:outline-gray-800"
|
||||
rows="3"
|
||||
placeholder={$i18n.t('Enter a detail about yourself for your LLMs to recall')}
|
||||
/>
|
||||
|
||||
<div class="text-xs text-gray-500">
|
||||
ⓘ {$i18n.t('Refer to yourself as "User" (e.g., "User is learning Spanish")')}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end pt-1 text-sm font-medium">
|
||||
<button
|
||||
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-3xl flex flex-row space-x-1 items-center {loading
|
||||
? ' cursor-not-allowed'
|
||||
: ''}"
|
||||
type="submit"
|
||||
disabled={loading}
|
||||
>
|
||||
{$i18n.t('Update')}
|
||||
|
||||
{#if loading}
|
||||
<div class="ml-2 self-center">
|
||||
<svg
|
||||
class=" w-4 h-4"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
><style>
|
||||
.spinner_ajPY {
|
||||
transform-origin: center;
|
||||
animation: spinner_AtaB 0.75s infinite linear;
|
||||
}
|
||||
@keyframes spinner_AtaB {
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
</style><path
|
||||
d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
|
||||
opacity=".25"
|
||||
/><path
|
||||
d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
|
||||
class="spinner_ajPY"
|
||||
/></svg
|
||||
>
|
||||
</div>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Modal>
|
||||
@@ -10,18 +10,24 @@
|
||||
import { deleteMemoriesByUserId, deleteMemoryById, getMemories } from '$lib/apis/memories';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import { error } from '@sveltejs/kit';
|
||||
import EditMemoryModal from './EditMemoryModal.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let show = false;
|
||||
|
||||
let memories = [];
|
||||
let loading = true;
|
||||
|
||||
let showAddMemoryModal = false;
|
||||
let showEditMemoryModal = false;
|
||||
|
||||
$: if (show) {
|
||||
let selectedMemory = null;
|
||||
|
||||
$: if (show && memories.length === 0 && loading) {
|
||||
(async () => {
|
||||
memories = await getMemories(localStorage.token);
|
||||
loading = false;
|
||||
})();
|
||||
}
|
||||
</script>
|
||||
@@ -62,7 +68,9 @@
|
||||
>
|
||||
<tr>
|
||||
<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
|
||||
<th scope="col" class="px-3 py-2 hidden md:flex"> {$i18n.t('Created At')} </th>
|
||||
<th scope="col" class="px-3 py-2 hidden md:flex">
|
||||
{$i18n.t('Last Modified')}
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-2 text-right" />
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -76,11 +84,38 @@
|
||||
</td>
|
||||
<td class=" px-3 py-1 hidden md:flex h-[2.5rem]">
|
||||
<div class="my-auto whitespace-nowrap">
|
||||
{dayjs(memory.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))}
|
||||
{dayjs(memory.updated_at * 1000).format(
|
||||
$i18n.t('MMMM DD, YYYY hh:mm:ss A')
|
||||
)}
|
||||
</div>
|
||||
</td>
|
||||
<td class="px-3 py-1">
|
||||
<div class="flex justify-end w-full">
|
||||
<Tooltip content="Edit">
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
on:click={() => {
|
||||
selectedMemory = memory;
|
||||
showEditMemoryModal = true;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-4 h-4 s-FoVA_WMOgxUD"
|
||||
><path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125"
|
||||
class="s-FoVA_WMOgxUD"
|
||||
/></svg
|
||||
>
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip content="Delete">
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
@@ -136,7 +171,7 @@
|
||||
class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-300 dark:outline-gray-800 rounded-3xl"
|
||||
on:click={() => {
|
||||
showAddMemoryModal = true;
|
||||
}}>Add memory</button
|
||||
}}>{$i18n.t('Add Memory')}</button
|
||||
>
|
||||
<button
|
||||
class=" px-3.5 py-1.5 font-medium text-red-500 hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-red-300 dark:outline-red-800 rounded-3xl"
|
||||
@@ -150,7 +185,7 @@
|
||||
toast.success('Memory cleared successfully');
|
||||
memories = [];
|
||||
}
|
||||
}}>Clear memory</button
|
||||
}}>{$i18n.t('Clear memory')}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -163,3 +198,11 @@
|
||||
memories = await getMemories(localStorage.token);
|
||||
}}
|
||||
/>
|
||||
|
||||
<EditMemoryModal
|
||||
bind:show={showEditMemoryModal}
|
||||
memory={selectedMemory}
|
||||
on:save={async () => {
|
||||
memories = await getMemories(localStorage.token);
|
||||
}}
|
||||
/>
|
||||
|
||||
@@ -8,16 +8,14 @@
|
||||
import Modal from '../common/Modal.svelte';
|
||||
import Account from './Settings/Account.svelte';
|
||||
import About from './Settings/About.svelte';
|
||||
import Models from './Settings/Models.svelte';
|
||||
import General from './Settings/General.svelte';
|
||||
import Interface from './Settings/Interface.svelte';
|
||||
import Audio from './Settings/Audio.svelte';
|
||||
import Chats from './Settings/Chats.svelte';
|
||||
import Connections from './Settings/Connections.svelte';
|
||||
import Images from './Settings/Images.svelte';
|
||||
import User from '../icons/User.svelte';
|
||||
import Personalization from './Settings/Personalization.svelte';
|
||||
import { updateUserSettings } from '$lib/apis/users';
|
||||
import { goto } from '$app/navigation';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -90,55 +88,32 @@
|
||||
<div class=" self-center">{$i18n.t('General')}</div>
|
||||
</button>
|
||||
|
||||
{#if $user?.role === 'admin'}
|
||||
{#if $user.role === 'admin'}
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'connections'
|
||||
'admin'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'connections';
|
||||
on:click={async () => {
|
||||
await goto('/admin/settings');
|
||||
show = false;
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M1 9.5A3.5 3.5 0 0 0 4.5 13H12a3 3 0 0 0 .917-5.857 2.503 2.503 0 0 0-3.198-3.019 3.5 3.5 0 0 0-6.628 2.171A3.5 3.5 0 0 0 1 9.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Connections')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'models'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'models';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M10 1c3.866 0 7 1.79 7 4s-3.134 4-7 4-7-1.79-7-4 3.134-4 7-4zm5.694 8.13c.464-.264.91-.583 1.306-.952V10c0 2.21-3.134 4-7 4s-7-1.79-7-4V8.178c.396.37.842.688 1.306.953C5.838 10.006 7.854 10.5 10 10.5s4.162-.494 5.694-1.37zM3 13.179V15c0 2.21 3.134 4 7 4s7-1.79 7-4v-1.822c-.396.37-.842.688-1.306.953-1.532.875-3.548 1.369-5.694 1.369s-4.162-.494-5.694-1.37A7.009 7.009 0 013 13.179z"
|
||||
d="M4.5 3.75a3 3 0 0 0-3 3v10.5a3 3 0 0 0 3 3h15a3 3 0 0 0 3-3V6.75a3 3 0 0 0-3-3h-15Zm4.125 3a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Zm-3.873 8.703a4.126 4.126 0 0 1 7.746 0 .75.75 0 0 1-.351.92 7.47 7.47 0 0 1-3.522.877 7.47 7.47 0 0 1-3.522-.877.75.75 0 0 1-.351-.92ZM15 8.25a.75.75 0 0 0 0 1.5h3.75a.75.75 0 0 0 0-1.5H15ZM14.25 12a.75.75 0 0 1 .75-.75h3.75a.75.75 0 0 1 0 1.5H15a.75.75 0 0 1-.75-.75Zm.75 2.25a.75.75 0 0 0 0 1.5h3.75a.75.75 0 0 0 0-1.5H15Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Models')}</div>
|
||||
<div class=" self-center">{$i18n.t('Admin Settings')}</div>
|
||||
</button>
|
||||
{/if}
|
||||
|
||||
@@ -210,34 +185,6 @@
|
||||
<div class=" self-center">{$i18n.t('Audio')}</div>
|
||||
</button>
|
||||
|
||||
{#if $user.role === 'admin'}
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'images'
|
||||
? 'bg-gray-200 dark:bg-gray-700'
|
||||
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
|
||||
on:click={() => {
|
||||
selectedTab = 'images';
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M2 4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4Zm10.5 5.707a.5.5 0 0 0-.146-.353l-1-1a.5.5 0 0 0-.708 0L9.354 9.646a.5.5 0 0 1-.708 0L6.354 7.354a.5.5 0 0 0-.708 0l-2 2a.5.5 0 0 0-.146.353V12a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5V9.707ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center">{$i18n.t('Images')}</div>
|
||||
</button>
|
||||
{/if}
|
||||
|
||||
<button
|
||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||
'chats'
|
||||
@@ -325,15 +272,6 @@
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'models'}
|
||||
<Models {getModels} />
|
||||
{:else if selectedTab === 'connections'}
|
||||
<Connections
|
||||
{getModels}
|
||||
on:save={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'interface'}
|
||||
<Interface
|
||||
{saveSettings}
|
||||
@@ -355,13 +293,6 @@
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'images'}
|
||||
<Images
|
||||
{saveSettings}
|
||||
on:save={() => {
|
||||
toast.success($i18n.t('Settings saved successfully!'));
|
||||
}}
|
||||
/>
|
||||
{:else if selectedTab === 'chats'}
|
||||
<Chats {saveSettings} />
|
||||
{:else if selectedTab === 'account'}
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
<script lang="ts">
|
||||
import { basicSetup, EditorView } from 'codemirror';
|
||||
import { keymap, placeholder } from '@codemirror/view';
|
||||
import { Compartment, EditorState } from '@codemirror/state';
|
||||
|
||||
import { acceptCompletion } from '@codemirror/autocomplete';
|
||||
import { indentWithTab } from '@codemirror/commands';
|
||||
|
||||
import { indentUnit } from '@codemirror/language';
|
||||
import { python } from '@codemirror/lang-python';
|
||||
import { oneDark } from '@codemirror/theme-one-dark';
|
||||
|
||||
import { onMount, createEventDispatcher } from 'svelte';
|
||||
import { formatPythonCode } from '$lib/apis/utils';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
export let boilerplate = '';
|
||||
export let value = '';
|
||||
|
||||
let codeEditor;
|
||||
|
||||
let isDarkMode = false;
|
||||
let editorTheme = new Compartment();
|
||||
|
||||
export const formatPythonCodeHandler = async () => {
|
||||
if (codeEditor) {
|
||||
const res = await formatPythonCode(value).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res && res.code) {
|
||||
const formattedCode = res.code;
|
||||
codeEditor.dispatch({
|
||||
changes: [{ from: 0, to: codeEditor.state.doc.length, insert: formattedCode }]
|
||||
});
|
||||
|
||||
toast.success('Code formatted successfully');
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
let extensions = [
|
||||
basicSetup,
|
||||
keymap.of([{ key: 'Tab', run: acceptCompletion }, indentWithTab]),
|
||||
python(),
|
||||
indentUnit.of(' '),
|
||||
placeholder('Enter your code here...'),
|
||||
EditorView.updateListener.of((e) => {
|
||||
if (e.docChanged) {
|
||||
value = e.state.doc.toString();
|
||||
}
|
||||
}),
|
||||
editorTheme.of([])
|
||||
];
|
||||
|
||||
onMount(() => {
|
||||
console.log(value);
|
||||
if (value === '') {
|
||||
value = boilerplate;
|
||||
}
|
||||
|
||||
// Check if html class has dark mode
|
||||
isDarkMode = document.documentElement.classList.contains('dark');
|
||||
|
||||
// python code editor, highlight python code
|
||||
codeEditor = new EditorView({
|
||||
state: EditorState.create({
|
||||
doc: value,
|
||||
extensions: extensions
|
||||
}),
|
||||
parent: document.getElementById('code-textarea')
|
||||
});
|
||||
|
||||
if (isDarkMode) {
|
||||
codeEditor.dispatch({
|
||||
effects: editorTheme.reconfigure(oneDark)
|
||||
});
|
||||
}
|
||||
|
||||
// listen to html class changes this should fire only when dark mode is toggled
|
||||
const observer = new MutationObserver((mutations) => {
|
||||
mutations.forEach((mutation) => {
|
||||
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
|
||||
const _isDarkMode = document.documentElement.classList.contains('dark');
|
||||
|
||||
if (_isDarkMode !== isDarkMode) {
|
||||
isDarkMode = _isDarkMode;
|
||||
if (_isDarkMode) {
|
||||
codeEditor.dispatch({
|
||||
effects: editorTheme.reconfigure(oneDark)
|
||||
});
|
||||
} else {
|
||||
codeEditor.dispatch({
|
||||
effects: editorTheme.reconfigure()
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
observer.observe(document.documentElement, {
|
||||
attributes: true,
|
||||
attributeFilter: ['class']
|
||||
});
|
||||
|
||||
const keydownHandler = async (e) => {
|
||||
if ((e.ctrlKey || e.metaKey) && e.key === 's') {
|
||||
e.preventDefault();
|
||||
dispatch('save');
|
||||
}
|
||||
|
||||
// Format code when Ctrl + Shift + F is pressed
|
||||
if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === 'f') {
|
||||
e.preventDefault();
|
||||
await formatPythonCodeHandler();
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener('keydown', keydownHandler);
|
||||
|
||||
return () => {
|
||||
observer.disconnect();
|
||||
document.removeEventListener('keydown', keydownHandler);
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="code-textarea" class="h-full w-full" />
|
||||
@@ -0,0 +1,109 @@
|
||||
<script lang="ts">
|
||||
import { onMount, createEventDispatcher } from 'svelte';
|
||||
import { fade } from 'svelte/transition';
|
||||
|
||||
import { flyAndScale } from '$lib/utils/transitions';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
export let title = 'Confirm your action';
|
||||
export let message = 'This action cannot be undone. Do you wish to continue?';
|
||||
|
||||
export let cancelLabel = 'Cancel';
|
||||
export let confirmLabel = 'Confirm';
|
||||
|
||||
export let show = false;
|
||||
let modalElement = null;
|
||||
let mounted = false;
|
||||
|
||||
const handleKeyDown = (event: KeyboardEvent) => {
|
||||
if (event.key === 'Escape') {
|
||||
console.log('Escape');
|
||||
show = false;
|
||||
}
|
||||
};
|
||||
|
||||
onMount(() => {
|
||||
mounted = true;
|
||||
});
|
||||
|
||||
$: if (mounted) {
|
||||
if (show) {
|
||||
window.addEventListener('keydown', handleKeyDown);
|
||||
document.body.style.overflow = 'hidden';
|
||||
} else {
|
||||
window.removeEventListener('keydown', handleKeyDown);
|
||||
document.body.style.overflow = 'unset';
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
{#if show}
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||
<div
|
||||
bind:this={modalElement}
|
||||
class=" fixed top-0 right-0 left-0 bottom-0 bg-black/60 w-full min-h-screen h-screen flex justify-center z-[9999] overflow-hidden overscroll-contain"
|
||||
in:fade={{ duration: 10 }}
|
||||
on:mousedown={() => {
|
||||
show = false;
|
||||
}}
|
||||
>
|
||||
<div
|
||||
class=" m-auto rounded-2xl max-w-full w-[32rem] mx-2 bg-gray-50 dark:bg-gray-950 shadow-3xl border border-gray-850"
|
||||
in:flyAndScale
|
||||
on:mousedown={(e) => {
|
||||
e.stopPropagation();
|
||||
}}
|
||||
>
|
||||
<div class="px-[1.75rem] py-6">
|
||||
<div class=" text-lg font-semibold dark:text-gray-200 mb-2.5">{title}</div>
|
||||
|
||||
<slot>
|
||||
<div class=" text-sm text-gray-500">
|
||||
{message}
|
||||
</div>
|
||||
</slot>
|
||||
|
||||
<div class="mt-6 flex justify-between gap-1.5">
|
||||
<button
|
||||
class="bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-white font-medium w-full py-2.5 rounded-lg transition"
|
||||
on:click={() => {
|
||||
show = false;
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{cancelLabel}
|
||||
</button>
|
||||
<button
|
||||
class="bg-gray-900 hover:bg-gray-850 text-gray-100 dark:bg-gray-100 dark:hover:bg-white dark:text-gray-800 font-medium w-full py-2.5 rounded-lg transition"
|
||||
on:click={() => {
|
||||
show = false;
|
||||
dispatch('confirm');
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{confirmLabel}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<style>
|
||||
.modal-content {
|
||||
animation: scaleUp 0.1s ease-out forwards;
|
||||
}
|
||||
|
||||
@keyframes scaleUp {
|
||||
from {
|
||||
transform: scale(0.985);
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
transform: scale(1);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -48,7 +48,7 @@
|
||||
<ChevronDown className="absolute end-2 top-1/2 -translate-y-[45%] size-3.5" strokeWidth="2.5" />
|
||||
</Select.Trigger>
|
||||
<Select.Content
|
||||
class="w-full rounded-lg bg-white dark:bg-gray-900 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-700/50 outline-none"
|
||||
class="w-full rounded-lg bg-white dark:bg-gray-900 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-850/50 outline-none"
|
||||
transition={flyAndScale}
|
||||
sideOffset={4}
|
||||
>
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { onDestroy } from 'svelte';
|
||||
import { marked } from 'marked';
|
||||
|
||||
import tippy from 'tippy.js';
|
||||
|
||||
export let placement = 'top';
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
)}
|
||||
</div>
|
||||
|
||||
<hr class=" dark:border-gray-700 my-3" />
|
||||
<hr class=" dark:border-gray-850 my-3" />
|
||||
{/if}
|
||||
|
||||
<div>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
export let saveHandler: Function;
|
||||
|
||||
let webConfig = null;
|
||||
let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper'];
|
||||
let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper', 'serply'];
|
||||
|
||||
let youtubeLanguage = 'en';
|
||||
let youtubeTranslation = null;
|
||||
@@ -68,10 +68,10 @@
|
||||
<select
|
||||
class="dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||
bind:value={webConfig.search.engine}
|
||||
placeholder="Select a engine"
|
||||
placeholder={$i18n.t('Select a engine')}
|
||||
required
|
||||
>
|
||||
<option disabled selected value="">Select a engine</option>
|
||||
<option disabled selected value="">{$i18n.t('Select a engine')}</option>
|
||||
{#each webSearchEngines as engine}
|
||||
<option value={engine}>{engine}</option>
|
||||
{/each}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<script lang="ts">
|
||||
export let className = 'w-4 h-4';
|
||||
export let strokeWidth = '0';
|
||||
</script>
|
||||
|
||||
<svg
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width={strokeWidth}
|
||||
stroke="currentColor"
|
||||
class={className}
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M12 5a7 7 0 0 0-7 7v1.17c.313-.11.65-.17 1-.17h2a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H6a3 3 0 0 1-3-3v-6a9 9 0 0 1 18 0v6a3 3 0 0 1-3 3h-2a1 1 0 0 1-1-1v-6a1 1 0 0 1 1-1h2c.35 0 .687.06 1 .17V12a7 7 0 0 0-7-7Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
@@ -0,0 +1,19 @@
|
||||
<script lang="ts">
|
||||
export let className = 'size-4';
|
||||
export let strokeWidth = '2';
|
||||
</script>
|
||||
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width={strokeWidth}
|
||||
stroke="currentColor"
|
||||
class={className}
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"
|
||||
/>
|
||||
</svg>
|
||||
@@ -0,0 +1,11 @@
|
||||
<script lang="ts">
|
||||
export let className = 'size-4';
|
||||
</script>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class={className}>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M12 6.75a5.25 5.25 0 0 1 6.775-5.025.75.75 0 0 1 .313 1.248l-3.32 3.319c.063.475.276.934.641 1.299.365.365.824.578 1.3.64l3.318-3.319a.75.75 0 0 1 1.248.313 5.25 5.25 0 0 1-5.472 6.756c-1.018-.086-1.87.1-2.309.634L7.344 21.3A3.298 3.298 0 1 1 2.7 16.657l8.684-7.151c.533-.44.72-1.291.634-2.309A5.342 5.342 0 0 1 12 6.75ZM4.117 19.125a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
@@ -21,17 +21,20 @@
|
||||
<div class="m-auto pb-10 flex flex-col justify-center">
|
||||
<div class="max-w-md">
|
||||
<div class="text-center dark:text-white text-2xl font-medium z-50">
|
||||
Account Activation Pending<br /> Contact Admin for WebUI Access
|
||||
{$i18n.t('Account Activation Pending')}<br />
|
||||
{$i18n.t('Contact Admin for WebUI Access')}
|
||||
</div>
|
||||
|
||||
<div class=" mt-4 text-center text-sm dark:text-gray-200 w-full">
|
||||
Your account status is currently pending activation.<br /> To access the WebUI, please reach
|
||||
out to the administrator. Admins can manage user statuses from the Admin Panel.
|
||||
{$i18n.t('Your account status is currently pending activation.')}<br />
|
||||
{$i18n.t(
|
||||
'To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.'
|
||||
)}
|
||||
</div>
|
||||
|
||||
{#if adminDetails}
|
||||
<div class="mt-4 text-sm font-medium text-center">
|
||||
<div>Admin: {adminDetails.name} ({adminDetails.email})</div>
|
||||
<div>{$i18n.t('Admin')}: {adminDetails.name} ({adminDetails.email})</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<script lang="ts">
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { goto } from '$app/navigation';
|
||||
import {
|
||||
user,
|
||||
@@ -11,10 +12,11 @@
|
||||
mobile,
|
||||
showArchivedChats
|
||||
} from '$lib/stores';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
import { onMount, getContext, tick } from 'svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
import { updateUserSettings } from '$lib/apis/users';
|
||||
import {
|
||||
deleteChatById,
|
||||
getChatList,
|
||||
@@ -25,37 +27,25 @@
|
||||
archiveChatById,
|
||||
cloneChatById
|
||||
} from '$lib/apis/chats';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { fade, slide } from 'svelte/transition';
|
||||
import { WEBUI_BASE_URL } from '$lib/constants';
|
||||
import Tooltip from '../common/Tooltip.svelte';
|
||||
import ChatMenu from './Sidebar/ChatMenu.svelte';
|
||||
import ShareChatModal from '../chat/ShareChatModal.svelte';
|
||||
import ArchiveBox from '../icons/ArchiveBox.svelte';
|
||||
|
||||
import ArchivedChatsModal from './Sidebar/ArchivedChatsModal.svelte';
|
||||
import UserMenu from './Sidebar/UserMenu.svelte';
|
||||
import { updateUserSettings } from '$lib/apis/users';
|
||||
import ChatItem from './Sidebar/ChatItem.svelte';
|
||||
import DeleteConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
|
||||
|
||||
const BREAKPOINT = 768;
|
||||
|
||||
let show = false;
|
||||
let navElement;
|
||||
|
||||
let title: string = 'UI';
|
||||
let search = '';
|
||||
|
||||
let shareChatId = null;
|
||||
let shiftKey = false;
|
||||
|
||||
let selectedChatId = null;
|
||||
let deleteChat = null;
|
||||
|
||||
let chatDeleteId = null;
|
||||
let chatTitleEditId = null;
|
||||
let chatTitle = '';
|
||||
|
||||
let showShareChatModal = false;
|
||||
let showDeleteConfirm = false;
|
||||
let showDropdown = false;
|
||||
let isEditing = false;
|
||||
|
||||
let filteredChatList = [];
|
||||
|
||||
$: filteredChatList = $chats.filter((chat) => {
|
||||
@@ -78,13 +68,6 @@
|
||||
}
|
||||
});
|
||||
|
||||
mobile;
|
||||
const onResize = () => {
|
||||
if ($showSidebar && window.innerWidth < BREAKPOINT) {
|
||||
showSidebar.set(false);
|
||||
}
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
mobile.subscribe((e) => {
|
||||
if ($showSidebar && e) {
|
||||
@@ -125,10 +108,28 @@
|
||||
checkDirection();
|
||||
};
|
||||
|
||||
const onKeyDown = (e) => {
|
||||
if (e.key === 'Shift') {
|
||||
shiftKey = true;
|
||||
}
|
||||
};
|
||||
|
||||
const onKeyUp = (e) => {
|
||||
if (e.key === 'Shift') {
|
||||
shiftKey = false;
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener('keydown', onKeyDown);
|
||||
document.addEventListener('keyup', onKeyUp);
|
||||
|
||||
window.addEventListener('touchstart', onTouchStart);
|
||||
window.addEventListener('touchend', onTouchEnd);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('keydown', onKeyDown);
|
||||
window.removeEventListener('keyup', onKeyUp);
|
||||
|
||||
window.removeEventListener('touchstart', onTouchStart);
|
||||
window.removeEventListener('touchend', onTouchEnd);
|
||||
};
|
||||
@@ -149,69 +150,29 @@
|
||||
await chats.set(enrichedChats);
|
||||
};
|
||||
|
||||
const loadChat = async (id) => {
|
||||
goto(`/c/${id}`);
|
||||
};
|
||||
|
||||
const editChatTitle = async (id, _title) => {
|
||||
if (_title === '') {
|
||||
toast.error($i18n.t('Title cannot be an empty string.'));
|
||||
} else {
|
||||
title = _title;
|
||||
|
||||
await updateChatById(localStorage.token, id, {
|
||||
title: _title
|
||||
});
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
}
|
||||
};
|
||||
|
||||
const deleteChat = async (id) => {
|
||||
const res = await deleteChatById(localStorage.token, id).catch((error) => {
|
||||
toast.error(error);
|
||||
chatDeleteId = null;
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
if ($chatId === id) {
|
||||
goto('/');
|
||||
}
|
||||
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
}
|
||||
};
|
||||
|
||||
const cloneChatHandler = async (id) => {
|
||||
const res = await cloneChatById(localStorage.token, id).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
goto(`/c/${res.id}`);
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
}
|
||||
};
|
||||
|
||||
const saveSettings = async (updated) => {
|
||||
await settings.set({ ...$settings, ...updated });
|
||||
await updateUserSettings(localStorage.token, { ui: $settings });
|
||||
location.href = '/';
|
||||
};
|
||||
|
||||
const archiveChatHandler = async (id) => {
|
||||
await archiveChatById(localStorage.token, id);
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
};
|
||||
const deleteChatHandler = async (id) => {
|
||||
const res = await deleteChatById(localStorage.token, id).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
const focusEdit = async (node: HTMLInputElement) => {
|
||||
node.focus();
|
||||
if (res) {
|
||||
if ($chatId === id) {
|
||||
await chatId.set('');
|
||||
await tick();
|
||||
goto('/');
|
||||
}
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<ShareChatModal bind:show={showShareChatModal} chatId={shareChatId} />
|
||||
<ArchivedChatsModal
|
||||
bind:show={$showArchivedChats}
|
||||
on:change={async () => {
|
||||
@@ -219,6 +180,18 @@
|
||||
}}
|
||||
/>
|
||||
|
||||
<DeleteConfirmDialog
|
||||
bind:show={showDeleteConfirm}
|
||||
title="Delete chat?"
|
||||
on:confirm={() => {
|
||||
deleteChatHandler(deleteChat.id);
|
||||
}}
|
||||
>
|
||||
<div class=" text-sm text-gray-500">
|
||||
This will delete <span class=" font-semibold">{deleteChat.title}</span>.
|
||||
</div>
|
||||
</DeleteConfirmDialog>
|
||||
|
||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||
|
||||
{#if $showSidebar}
|
||||
@@ -252,12 +225,10 @@
|
||||
draggable="false"
|
||||
on:click={async () => {
|
||||
selectedChatId = null;
|
||||
|
||||
await goto('/');
|
||||
const newChatButton = document.getElementById('new-chat-button');
|
||||
setTimeout(() => {
|
||||
newChatButton?.click();
|
||||
|
||||
if ($mobile) {
|
||||
showSidebar.set(false);
|
||||
}
|
||||
@@ -325,6 +296,10 @@
|
||||
on:click={() => {
|
||||
selectedChatId = null;
|
||||
chatId.set('');
|
||||
|
||||
if ($mobile) {
|
||||
showSidebar.set(false);
|
||||
}
|
||||
}}
|
||||
draggable="false"
|
||||
>
|
||||
@@ -482,215 +457,18 @@
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class=" w-full pr-2 relative group">
|
||||
{#if chatTitleEditId === chat.id}
|
||||
<div
|
||||
class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId ||
|
||||
chat.id === chatTitleEditId ||
|
||||
chat.id === chatDeleteId
|
||||
? 'bg-gray-200 dark:bg-gray-900'
|
||||
: chat.id === selectedChatId
|
||||
? 'bg-gray-100 dark:bg-gray-950'
|
||||
: 'group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
|
||||
>
|
||||
<input
|
||||
use:focusEdit
|
||||
bind:value={chatTitle}
|
||||
class=" bg-transparent w-full outline-none mr-10"
|
||||
/>
|
||||
</div>
|
||||
{:else}
|
||||
<a
|
||||
class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId ||
|
||||
chat.id === chatTitleEditId ||
|
||||
chat.id === chatDeleteId
|
||||
? 'bg-gray-200 dark:bg-gray-900'
|
||||
: chat.id === selectedChatId
|
||||
? 'bg-gray-100 dark:bg-gray-950'
|
||||
: ' group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
|
||||
href="/c/{chat.id}"
|
||||
on:click={() => {
|
||||
selectedChatId = chat.id;
|
||||
if ($mobile) {
|
||||
showSidebar.set(false);
|
||||
}
|
||||
}}
|
||||
on:dblclick={() => {
|
||||
chatTitle = chat.title;
|
||||
chatTitleEditId = chat.id;
|
||||
}}
|
||||
draggable="false"
|
||||
>
|
||||
<div class=" flex self-center flex-1 w-full">
|
||||
<div class=" text-left self-center overflow-hidden w-full h-[20px]">
|
||||
{chat.title}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
<div
|
||||
class="
|
||||
|
||||
{chat.id === $chatId || chat.id === chatTitleEditId || chat.id === chatDeleteId
|
||||
? 'from-gray-200 dark:from-gray-900'
|
||||
: chat.id === selectedChatId
|
||||
? 'from-gray-100 dark:from-gray-950'
|
||||
: 'invisible group-hover:visible from-gray-100 dark:from-gray-950'}
|
||||
absolute right-[10px] top-[10px] pr-2 pl-5 bg-gradient-to-l from-80%
|
||||
|
||||
to-transparent"
|
||||
>
|
||||
{#if chatTitleEditId === chat.id}
|
||||
<div class="flex self-center space-x-1.5 z-10">
|
||||
<button
|
||||
class=" self-center dark:hover:text-white transition"
|
||||
on:click={() => {
|
||||
editChatTitle(chat.id, chatTitle);
|
||||
chatTitleEditId = null;
|
||||
chatTitle = '';
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
<button
|
||||
class=" self-center dark:hover:text-white transition"
|
||||
on:click={() => {
|
||||
chatTitleEditId = null;
|
||||
chatTitle = '';
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
{:else if chatDeleteId === chat.id}
|
||||
<div class="flex self-center space-x-1.5 z-10">
|
||||
<button
|
||||
class=" self-center dark:hover:text-white transition"
|
||||
on:click={() => {
|
||||
deleteChat(chat.id);
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
<button
|
||||
class=" self-center dark:hover:text-white transition"
|
||||
on:click={() => {
|
||||
chatDeleteId = null;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
{:else}
|
||||
<div class="flex self-center space-x-1 z-10">
|
||||
<ChatMenu
|
||||
chatId={chat.id}
|
||||
cloneChatHandler={() => {
|
||||
cloneChatHandler(chat.id);
|
||||
}}
|
||||
shareHandler={() => {
|
||||
shareChatId = selectedChatId;
|
||||
showShareChatModal = true;
|
||||
}}
|
||||
archiveChatHandler={() => {
|
||||
archiveChatHandler(chat.id);
|
||||
}}
|
||||
renameHandler={() => {
|
||||
chatTitle = chat.title;
|
||||
chatTitleEditId = chat.id;
|
||||
}}
|
||||
deleteHandler={() => {
|
||||
chatDeleteId = chat.id;
|
||||
}}
|
||||
onClose={() => {
|
||||
selectedChatId = null;
|
||||
}}
|
||||
>
|
||||
<button
|
||||
aria-label="Chat Menu"
|
||||
class=" self-center dark:hover:text-white transition"
|
||||
on:click={() => {
|
||||
selectedChatId = chat.id;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M2 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM6.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM12.5 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</ChatMenu>
|
||||
|
||||
{#if chat.id === $chatId}
|
||||
<button
|
||||
id="delete-chat-button"
|
||||
class="hidden"
|
||||
on:click={() => {
|
||||
chatDeleteId = chat.id;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M2 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM6.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM12.5 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<ChatItem
|
||||
{chat}
|
||||
{shiftKey}
|
||||
selected={selectedChatId === chat.id}
|
||||
on:select={() => {
|
||||
selectedChatId = chat.id;
|
||||
}}
|
||||
on:delete={() => {
|
||||
deleteChat = chat;
|
||||
showDeleteConfirm = true;
|
||||
}}
|
||||
/>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,281 @@
|
||||
<script lang="ts">
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { goto, invalidate, invalidateAll } from '$app/navigation';
|
||||
import { onMount, getContext, createEventDispatcher, tick } from 'svelte';
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
import {
|
||||
archiveChatById,
|
||||
cloneChatById,
|
||||
deleteChatById,
|
||||
getChatList,
|
||||
updateChatById
|
||||
} from '$lib/apis/chats';
|
||||
import { chatId, chats, mobile, showSidebar } from '$lib/stores';
|
||||
|
||||
import ChatMenu from './ChatMenu.svelte';
|
||||
import ShareChatModal from '$lib/components/chat/ShareChatModal.svelte';
|
||||
import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
|
||||
|
||||
export let chat;
|
||||
export let selected = false;
|
||||
export let shiftKey = false;
|
||||
|
||||
let mouseOver = false;
|
||||
|
||||
let showShareChatModal = false;
|
||||
let confirmEdit = false;
|
||||
|
||||
let chatTitle = chat.title;
|
||||
|
||||
const editChatTitle = async (id, _title) => {
|
||||
if (_title === '') {
|
||||
toast.error($i18n.t('Title cannot be an empty string.'));
|
||||
} else {
|
||||
await updateChatById(localStorage.token, id, {
|
||||
title: _title
|
||||
});
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
}
|
||||
};
|
||||
|
||||
const cloneChatHandler = async (id) => {
|
||||
const res = await cloneChatById(localStorage.token, id).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
goto(`/c/${res.id}`);
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
}
|
||||
};
|
||||
|
||||
const archiveChatHandler = async (id) => {
|
||||
await archiveChatById(localStorage.token, id);
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
};
|
||||
|
||||
const focusEdit = async (node: HTMLInputElement) => {
|
||||
node.focus();
|
||||
};
|
||||
</script>
|
||||
|
||||
<ShareChatModal bind:show={showShareChatModal} chatId={chat.id} />
|
||||
|
||||
<div class=" w-full pr-2 relative group">
|
||||
{#if confirmEdit}
|
||||
<div
|
||||
class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId || confirmEdit
|
||||
? 'bg-gray-200 dark:bg-gray-900'
|
||||
: selected
|
||||
? 'bg-gray-100 dark:bg-gray-950'
|
||||
: 'group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
|
||||
>
|
||||
<input
|
||||
use:focusEdit
|
||||
bind:value={chatTitle}
|
||||
class=" bg-transparent w-full outline-none mr-10"
|
||||
/>
|
||||
</div>
|
||||
{:else}
|
||||
<a
|
||||
class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId || confirmEdit
|
||||
? 'bg-gray-200 dark:bg-gray-900'
|
||||
: selected
|
||||
? 'bg-gray-100 dark:bg-gray-950'
|
||||
: ' group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
|
||||
href="/c/{chat.id}"
|
||||
on:click={() => {
|
||||
dispatch('select');
|
||||
|
||||
if ($mobile) {
|
||||
showSidebar.set(false);
|
||||
}
|
||||
}}
|
||||
on:dblclick={() => {
|
||||
chatTitle = chat.title;
|
||||
confirmEdit = true;
|
||||
}}
|
||||
on:mouseenter={(e) => {
|
||||
mouseOver = true;
|
||||
}}
|
||||
on:mouseleave={(e) => {
|
||||
mouseOver = false;
|
||||
}}
|
||||
on:focus={(e) => {}}
|
||||
draggable="false"
|
||||
>
|
||||
<div class=" flex self-center flex-1 w-full">
|
||||
<div class=" text-left self-center overflow-hidden w-full h-[20px]">
|
||||
{chat.title}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||
<div
|
||||
class="
|
||||
{chat.id === $chatId || confirmEdit
|
||||
? 'from-gray-200 dark:from-gray-900'
|
||||
: selected
|
||||
? 'from-gray-100 dark:from-gray-950'
|
||||
: 'invisible group-hover:visible from-gray-100 dark:from-gray-950'}
|
||||
absolute right-[10px] top-[10px] pr-2 pl-5 bg-gradient-to-l from-80%
|
||||
|
||||
to-transparent"
|
||||
on:mouseenter={(e) => {
|
||||
mouseOver = true;
|
||||
}}
|
||||
on:mouseleave={(e) => {
|
||||
mouseOver = false;
|
||||
}}
|
||||
>
|
||||
{#if confirmEdit}
|
||||
<div class="flex self-center space-x-1.5 z-10">
|
||||
<Tooltip content="Confirm">
|
||||
<button
|
||||
class=" self-center dark:hover:text-white transition"
|
||||
on:click={() => {
|
||||
editChatTitle(chat.id, chatTitle);
|
||||
confirmEdit = false;
|
||||
chatTitle = '';
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip content="Cancel">
|
||||
<button
|
||||
class=" self-center dark:hover:text-white transition"
|
||||
on:click={() => {
|
||||
confirmEdit = false;
|
||||
chatTitle = '';
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
{:else if shiftKey && mouseOver}
|
||||
<div class=" flex items-center self-center space-x-1.5">
|
||||
<Tooltip content="Archive" className="flex items-center">
|
||||
<button
|
||||
class=" self-center dark:hover:text-white transition"
|
||||
on:click={() => {
|
||||
archiveChatHandler(chat.id);
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<ArchiveBox className="size-4 translate-y-[0.5px]" strokeWidth="2" />
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip content="Delete">
|
||||
<button
|
||||
class=" self-center dark:hover:text-white transition"
|
||||
on:click={() => {
|
||||
deleteChat(chat.id);
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<GarbageBin strokeWidth="2" />
|
||||
</button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
{:else}
|
||||
<div class="flex self-center space-x-1 z-10">
|
||||
<ChatMenu
|
||||
chatId={chat.id}
|
||||
cloneChatHandler={() => {
|
||||
cloneChatHandler(chat.id);
|
||||
}}
|
||||
shareHandler={() => {
|
||||
showShareChatModal = true;
|
||||
}}
|
||||
archiveChatHandler={() => {
|
||||
archiveChatHandler(chat.id);
|
||||
}}
|
||||
renameHandler={() => {
|
||||
chatTitle = chat.title;
|
||||
|
||||
confirmEdit = true;
|
||||
}}
|
||||
deleteHandler={() => {
|
||||
dispatch('delete');
|
||||
}}
|
||||
onClose={() => {
|
||||
selected = false;
|
||||
}}
|
||||
>
|
||||
<button
|
||||
aria-label="Chat Menu"
|
||||
class=" self-center dark:hover:text-white transition"
|
||||
on:click={() => {
|
||||
dispatch('select');
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M2 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM6.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM12.5 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</ChatMenu>
|
||||
|
||||
{#if chat.id === $chatId}
|
||||
<!-- Shortcut support using "delete-chat-button" id -->
|
||||
<button
|
||||
id="delete-chat-button"
|
||||
class="hidden"
|
||||
on:click={() => {
|
||||
dispatch('delete');
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M2 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM6.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM12.5 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
@@ -145,7 +145,7 @@
|
||||
|
||||
<Tooltip
|
||||
content={$USAGE_POOL && $USAGE_POOL.length > 0
|
||||
? `Running: ${$USAGE_POOL.join(', ')} ✨`
|
||||
? `${$i18n.t('Running')}: ${$USAGE_POOL.join(', ')} ✨`
|
||||
: ''}
|
||||
>
|
||||
<div class="flex rounded-md py-1.5 px-3 text-xs gap-2.5 items-center">
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
const { saveAs } = fileSaver;
|
||||
|
||||
import { onMount, getContext } from 'svelte';
|
||||
import { WEBUI_NAME, documents } from '$lib/stores';
|
||||
import { WEBUI_NAME, documents, showSidebar } from '$lib/stores';
|
||||
import { createNewDoc, deleteDocByName, getDocs } from '$lib/apis/documents';
|
||||
|
||||
import { SUPPORTED_FILE_TYPE, SUPPORTED_FILE_EXTENSIONS } from '$lib/constants';
|
||||
@@ -15,7 +15,6 @@
|
||||
|
||||
import EditDocModal from '$lib/components/documents/EditDocModal.svelte';
|
||||
import AddFilesPlaceholder from '$lib/components/AddFilesPlaceholder.svelte';
|
||||
import SettingsModal from '$lib/components/documents/SettingsModal.svelte';
|
||||
import AddDocModal from '$lib/components/documents/AddDocModal.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
@@ -158,12 +157,14 @@
|
||||
|
||||
{#if dragged}
|
||||
<div
|
||||
class="fixed w-full h-full flex z-50 touch-none pointer-events-none"
|
||||
class="fixed {$showSidebar
|
||||
? 'left-0 md:left-[260px] md:w-[calc(100%-260px)]'
|
||||
: 'left-0'} w-full h-full flex z-50 touch-none pointer-events-none"
|
||||
id="dropzone"
|
||||
role="region"
|
||||
aria-label="Drag and Drop Container"
|
||||
>
|
||||
<div class="absolute rounded-xl w-full h-full backdrop-blur bg-gray-800/40 flex justify-center">
|
||||
<div class="absolute w-full h-full backdrop-blur bg-gray-800/40 flex justify-center">
|
||||
<div class="m-auto pt-64 flex flex-col justify-center">
|
||||
<div class="max-w-md">
|
||||
<AddFilesPlaceholder>
|
||||
@@ -183,39 +184,9 @@
|
||||
|
||||
<AddDocModal bind:show={showAddDocModal} />
|
||||
|
||||
<SettingsModal bind:show={showSettingsModal} />
|
||||
|
||||
<div class="mb-3">
|
||||
<div class="flex justify-between items-center">
|
||||
<div class=" text-lg font-semibold self-center">{$i18n.t('Documents')}</div>
|
||||
|
||||
<div>
|
||||
<button
|
||||
class="flex items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
showSettingsModal = !showSettingsModal;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M6.955 1.45A.5.5 0 0 1 7.452 1h1.096a.5.5 0 0 1 .497.45l.17 1.699c.484.12.94.312 1.356.562l1.321-1.081a.5.5 0 0 1 .67.033l.774.775a.5.5 0 0 1 .034.67l-1.08 1.32c.25.417.44.873.561 1.357l1.699.17a.5.5 0 0 1 .45.497v1.096a.5.5 0 0 1-.45.497l-1.699.17c-.12.484-.312.94-.562 1.356l1.082 1.322a.5.5 0 0 1-.034.67l-.774.774a.5.5 0 0 1-.67.033l-1.322-1.08c-.416.25-.872.44-1.356.561l-.17 1.699a.5.5 0 0 1-.497.45H7.452a.5.5 0 0 1-.497-.45l-.17-1.699a4.973 4.973 0 0 1-1.356-.562L4.108 13.37a.5.5 0 0 1-.67-.033l-.774-.775a.5.5 0 0 1-.034-.67l1.08-1.32a4.971 4.971 0 0 1-.561-1.357l-1.699-.17A.5.5 0 0 1 1 8.548V7.452a.5.5 0 0 1 .45-.497l1.699-.17c.12-.484.312-.94.562-1.356L2.629 4.107a.5.5 0 0 1 .034-.67l.774-.774a.5.5 0 0 1 .67-.033L5.43 3.71a4.97 4.97 0 0 1 1.356-.561l.17-1.699ZM6 8c0 .538.212 1.026.558 1.385l.057.057a2 2 0 0 0 2.828-2.828l-.058-.056A2 2 0 0 0 6 8Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
|
||||
<div class=" text-xs">{$i18n.t('Document Settings')}</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class=" text-gray-500 text-xs mt-1">
|
||||
ⓘ {$i18n.t("Use '#' in the prompt input to load and select your documents.")}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -520,6 +491,10 @@
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<div class=" text-gray-500 text-xs mt-1 mb-2">
|
||||
ⓘ {$i18n.t("Use '#' in the prompt input to load and select your documents.")}
|
||||
</div>
|
||||
|
||||
<div class=" flex justify-end w-full mb-2">
|
||||
<div class="flex space-x-2">
|
||||
<input
|
||||
|
||||
@@ -17,15 +17,19 @@
|
||||
|
||||
import EllipsisHorizontal from '../icons/EllipsisHorizontal.svelte';
|
||||
import ModelMenu from './Models/ModelMenu.svelte';
|
||||
import ModelDeleteConfirmDialog from '../common/ConfirmDialog.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let showModelDeleteConfirm = false;
|
||||
|
||||
let localModelfiles = [];
|
||||
|
||||
let importFiles;
|
||||
let modelsImportInputElement: HTMLInputElement;
|
||||
|
||||
let _models = [];
|
||||
let selectedModel = null;
|
||||
|
||||
let sortable = null;
|
||||
let searchValue = '';
|
||||
@@ -71,16 +75,19 @@
|
||||
const url = 'https://openwebui.com';
|
||||
|
||||
const tab = await window.open(`${url}/models/create`, '_blank');
|
||||
window.addEventListener(
|
||||
'message',
|
||||
(event) => {
|
||||
if (event.origin !== url) return;
|
||||
if (event.data === 'loaded') {
|
||||
tab.postMessage(JSON.stringify(model), '*');
|
||||
}
|
||||
},
|
||||
false
|
||||
);
|
||||
|
||||
// Define the event handler function
|
||||
const messageHandler = (event) => {
|
||||
if (event.origin !== url) return;
|
||||
if (event.data === 'loaded') {
|
||||
tab.postMessage(JSON.stringify(model), '*');
|
||||
|
||||
// Remove the event listener after handling the message
|
||||
window.removeEventListener('message', messageHandler);
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener('message', messageHandler, false);
|
||||
};
|
||||
|
||||
const hideModelHandler = async (model) => {
|
||||
@@ -196,6 +203,13 @@
|
||||
</title>
|
||||
</svelte:head>
|
||||
|
||||
<ModelDeleteConfirmDialog
|
||||
bind:show={showModelDeleteConfirm}
|
||||
on:confirm={() => {
|
||||
deleteModelHandler(selectedModel);
|
||||
}}
|
||||
/>
|
||||
|
||||
<div class=" text-lg font-semibold mb-3">{$i18n.t('Models')}</div>
|
||||
|
||||
<div class=" flex w-full space-x-2">
|
||||
@@ -336,7 +350,8 @@
|
||||
hideModelHandler(model);
|
||||
}}
|
||||
deleteHandler={() => {
|
||||
deleteModelHandler(model);
|
||||
selectedModel = model;
|
||||
showModelDeleteConfirm = true;
|
||||
}}
|
||||
onClose={() => {}}
|
||||
>
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
<script lang="ts">
|
||||
import { getContext } from 'svelte';
|
||||
import Selector from './Knowledge/Selector.svelte';
|
||||
|
||||
export let knowledge = [];
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<div class="flex w-full justify-between mb-1">
|
||||
<div class=" self-center text-sm font-semibold">{$i18n.t('Knowledge')}</div>
|
||||
</div>
|
||||
|
||||
<div class=" text-xs dark:text-gray-500">
|
||||
{$i18n.t('To add documents here, upload them to the "Documents" workspace first.')}
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col">
|
||||
{#if knowledge.length > 0}
|
||||
<div class=" flex items-center gap-2 mt-2">
|
||||
{#each knowledge as file, fileIdx}
|
||||
<div class=" relative group">
|
||||
<div
|
||||
class="h-16 w-[15rem] flex items-center space-x-3 px-2.5 dark:bg-gray-600 rounded-xl border border-gray-200 dark:border-none"
|
||||
>
|
||||
<div class="p-2.5 bg-red-400 text-white rounded-lg">
|
||||
{#if (file?.type ?? 'doc') === 'doc'}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-6"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
|
||||
/>
|
||||
</svg>
|
||||
{:else if file.type === 'collection'}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-6"
|
||||
>
|
||||
<path
|
||||
d="M7.5 3.375c0-1.036.84-1.875 1.875-1.875h.375a3.75 3.75 0 0 1 3.75 3.75v1.875C13.5 8.161 14.34 9 15.375 9h1.875A3.75 3.75 0 0 1 21 12.75v3.375C21 17.16 20.16 18 19.125 18h-9.75A1.875 1.875 0 0 1 7.5 16.125V3.375Z"
|
||||
/>
|
||||
<path
|
||||
d="M15 5.25a5.23 5.23 0 0 0-1.279-3.434 9.768 9.768 0 0 1 6.963 6.963A5.23 5.23 0 0 0 17.25 7.5h-1.875A.375.375 0 0 1 15 7.125V5.25ZM4.875 6H6v10.125A3.375 3.375 0 0 0 9.375 19.5H16.5v1.125c0 1.035-.84 1.875-1.875 1.875h-9.75A1.875 1.875 0 0 1 3 20.625V7.875C3 6.839 3.84 6 4.875 6Z"
|
||||
/>
|
||||
</svg>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col justify-center -space-y-0.5">
|
||||
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
|
||||
{file?.title ?? `#${file.name}`}
|
||||
</div>
|
||||
|
||||
<div class=" text-gray-500 text-sm">{$i18n.t(file?.type ?? 'Document')}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" absolute -top-1 -right-1">
|
||||
<button
|
||||
class=" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
knowledge.splice(fileIdx, 1);
|
||||
knowledge = knowledge;
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="flex flex-wrap text-sm font-medium gap-1.5 mt-2">
|
||||
<Selector bind:knowledge>
|
||||
<button
|
||||
class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-300 dark:outline-gray-800 rounded-3xl"
|
||||
type="button">{$i18n.t('Select Documents')}</button
|
||||
>
|
||||
</Selector>
|
||||
</div>
|
||||
<!-- {knowledge} -->
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,138 @@
|
||||
<script lang="ts">
|
||||
import { DropdownMenu } from 'bits-ui';
|
||||
|
||||
import { documents } from '$lib/stores';
|
||||
import { flyAndScale } from '$lib/utils/transitions';
|
||||
|
||||
import Dropdown from '$lib/components/common/Dropdown.svelte';
|
||||
import { onMount, getContext } from 'svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let onClose: Function = () => {};
|
||||
|
||||
export let knowledge = [];
|
||||
|
||||
let items = [];
|
||||
|
||||
onMount(() => {
|
||||
let collections = [
|
||||
...($documents.length > 0
|
||||
? [
|
||||
{
|
||||
name: 'All Documents',
|
||||
type: 'collection',
|
||||
title: $i18n.t('All Documents'),
|
||||
collection_names: $documents.map((doc) => doc.collection_name)
|
||||
}
|
||||
]
|
||||
: []),
|
||||
...$documents
|
||||
.reduce((a, e, i, arr) => {
|
||||
return [...new Set([...a, ...(e?.content?.tags ?? []).map((tag) => tag.name)])];
|
||||
}, [])
|
||||
.map((tag) => ({
|
||||
name: tag,
|
||||
type: 'collection',
|
||||
collection_names: $documents
|
||||
.filter((doc) => (doc?.content?.tags ?? []).map((tag) => tag.name).includes(tag))
|
||||
.map((doc) => doc.collection_name)
|
||||
}))
|
||||
];
|
||||
|
||||
items = [...collections, ...$documents];
|
||||
});
|
||||
</script>
|
||||
|
||||
<Dropdown
|
||||
on:change={(e) => {
|
||||
if (e.detail === false) {
|
||||
onClose();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<slot />
|
||||
|
||||
<div slot="content">
|
||||
<DropdownMenu.Content
|
||||
class="w-full max-w-[300px] rounded-lg px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-lg"
|
||||
sideOffset={8}
|
||||
side="bottom"
|
||||
align="start"
|
||||
transition={flyAndScale}
|
||||
>
|
||||
<div class="max-h-[10rem] overflow-y-scroll">
|
||||
{#if items.length === 0}
|
||||
<div class="text-center text-sm text-gray-500 dark:text-gray-400">
|
||||
{$i18n.t('No documents found')}
|
||||
</div>
|
||||
{:else}
|
||||
{#each items as item}
|
||||
<DropdownMenu.Item
|
||||
class="flex gap-2.5 items-center px-3 py-2 text-sm cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
on:click={() => {
|
||||
if (!knowledge.find((k) => k.name === item.name)) {
|
||||
knowledge = [
|
||||
...knowledge,
|
||||
{
|
||||
...item,
|
||||
type: item?.type ?? 'doc'
|
||||
}
|
||||
];
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div class="flex self-start">
|
||||
{#if (item?.type ?? 'doc') === 'doc'}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="w-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
|
||||
/>
|
||||
</svg>
|
||||
{:else if item.type === 'collection'}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
d="M7.5 3.375c0-1.036.84-1.875 1.875-1.875h.375a3.75 3.75 0 0 1 3.75 3.75v1.875C13.5 8.161 14.34 9 15.375 9h1.875A3.75 3.75 0 0 1 21 12.75v3.375C21 17.16 20.16 18 19.125 18h-9.75A1.875 1.875 0 0 1 7.5 16.125V3.375Z"
|
||||
/>
|
||||
<path
|
||||
d="M15 5.25a5.23 5.23 0 0 0-1.279-3.434 9.768 9.768 0 0 1 6.963 6.963A5.23 5.23 0 0 0 17.25 7.5h-1.875A.375.375 0 0 1 15 7.125V5.25ZM4.875 6H6v10.125A3.375 3.375 0 0 0 9.375 19.5H16.5v1.125c0 1.035-.84 1.875-1.875 1.875h-9.75A1.875 1.875 0 0 1 3 20.625V7.875C3 6.839 3.84 6 4.875 6Z"
|
||||
/>
|
||||
</svg>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
<div class="flex flex-col">
|
||||
<div
|
||||
class=" w-fit text-xs font-black px-1 rounded uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
||||
>
|
||||
{item?.type ?? 'Document'}
|
||||
</div>
|
||||
|
||||
<div class="line-clamp-1 font-medium pr-0.5">
|
||||
{item.name}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</DropdownMenu.Item>
|
||||
{/each}
|
||||
{/if}
|
||||
</div>
|
||||
</DropdownMenu.Content>
|
||||
</div>
|
||||
</Dropdown>
|
||||
@@ -0,0 +1,57 @@
|
||||
<script lang="ts">
|
||||
import Checkbox from '$lib/components/common/Checkbox.svelte';
|
||||
import { getContext, onMount } from 'svelte';
|
||||
|
||||
export let tools = [];
|
||||
|
||||
let _tools = {};
|
||||
|
||||
export let selectedToolIds = [];
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
onMount(() => {
|
||||
_tools = tools.reduce((acc, tool) => {
|
||||
acc[tool.id] = {
|
||||
...tool,
|
||||
selected: selectedToolIds.includes(tool.id)
|
||||
};
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
});
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<div class="flex w-full justify-between mb-1">
|
||||
<div class=" self-center text-sm font-semibold">{$i18n.t('Tools')}</div>
|
||||
</div>
|
||||
|
||||
<div class=" text-xs dark:text-gray-500">
|
||||
{$i18n.t('To select toolkits here, add them to the "Tools" workspace first.')}
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col">
|
||||
{#if tools.length > 0}
|
||||
<div class=" flex items-center gap-2 mt-2">
|
||||
{#each Object.keys(_tools) as tool, toolIdx}
|
||||
<div class=" flex items-center gap-2">
|
||||
<div class="self-center flex items-center">
|
||||
<Checkbox
|
||||
state={_tools[tool].selected ? 'checked' : 'unchecked'}
|
||||
on:change={(e) => {
|
||||
_tools[tool].selected = e.detail === 'checked';
|
||||
selectedToolIds = Object.keys(_tools).filter((t) => _tools[t].selected);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 text-sm w-full capitalize font-medium">
|
||||
{_tools[tool].name}
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
@@ -80,8 +80,6 @@
|
||||
if (stopResponseFlag) {
|
||||
controller.abort('User: Stop Response');
|
||||
}
|
||||
|
||||
currentRequestId = null;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -97,11 +95,7 @@
|
||||
let data = JSON.parse(line.replace(/^data: /, ''));
|
||||
console.log(data);
|
||||
|
||||
if ('request_id' in data) {
|
||||
currentRequestId = data.request_id;
|
||||
} else {
|
||||
text += data.choices[0].delta.content ?? '';
|
||||
}
|
||||
text += data.choices[0].delta.content ?? '';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -178,21 +172,17 @@
|
||||
let data = JSON.parse(line.replace(/^data: /, ''));
|
||||
console.log(data);
|
||||
|
||||
if ('request_id' in data) {
|
||||
currentRequestId = data.request_id;
|
||||
if (responseMessage.content == '' && data.choices[0].delta.content == '\n') {
|
||||
continue;
|
||||
} else {
|
||||
if (responseMessage.content == '' && data.choices[0].delta.content == '\n') {
|
||||
continue;
|
||||
} else {
|
||||
textareaElement.style.height = textareaElement.scrollHeight + 'px';
|
||||
textareaElement.style.height = textareaElement.scrollHeight + 'px';
|
||||
|
||||
responseMessage.content += data.choices[0].delta.content ?? '';
|
||||
messages = messages;
|
||||
responseMessage.content += data.choices[0].delta.content ?? '';
|
||||
messages = messages;
|
||||
|
||||
textareaElement.style.height = textareaElement.scrollHeight + 'px';
|
||||
textareaElement.style.height = textareaElement.scrollHeight + 'px';
|
||||
|
||||
await tick();
|
||||
}
|
||||
await tick();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,358 @@
|
||||
<script lang="ts">
|
||||
import { toast } from 'svelte-sonner';
|
||||
import fileSaver from 'file-saver';
|
||||
const { saveAs } = fileSaver;
|
||||
|
||||
import { onMount, getContext } from 'svelte';
|
||||
import { WEBUI_NAME, prompts, tools } from '$lib/stores';
|
||||
import { createNewPrompt, deletePromptByCommand, getPrompts } from '$lib/apis/prompts';
|
||||
|
||||
import { goto } from '$app/navigation';
|
||||
import {
|
||||
createNewTool,
|
||||
deleteToolById,
|
||||
exportTools,
|
||||
getToolById,
|
||||
getTools
|
||||
} from '$lib/apis/tools';
|
||||
import ArrowDownTray from '../icons/ArrowDownTray.svelte';
|
||||
import Tooltip from '../common/Tooltip.svelte';
|
||||
import ConfirmDialog from '../common/ConfirmDialog.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let toolsImportInputElement: HTMLInputElement;
|
||||
let importFiles;
|
||||
|
||||
let showConfirm = false;
|
||||
let query = '';
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>
|
||||
{$i18n.t('Tools')} | {$WEBUI_NAME}
|
||||
</title>
|
||||
</svelte:head>
|
||||
|
||||
<div class="mb-3 flex justify-between items-center">
|
||||
<div class=" text-lg font-semibold self-center">{$i18n.t('Tools')}</div>
|
||||
</div>
|
||||
|
||||
<div class=" flex w-full space-x-2">
|
||||
<div class="flex flex-1">
|
||||
<div class=" self-center ml-1 mr-3">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<input
|
||||
class=" w-full text-sm pr-4 py-1 rounded-r-xl outline-none bg-transparent"
|
||||
bind:value={query}
|
||||
placeholder={$i18n.t('Search Tools')}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a
|
||||
class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 transition font-medium text-sm flex items-center space-x-1"
|
||||
href="/workspace/tools/create"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<hr class=" dark:border-gray-850 my-2.5" />
|
||||
|
||||
<div class="my-3 mb-5">
|
||||
{#each $tools.filter((t) => query === '' || t.name
|
||||
.toLowerCase()
|
||||
.includes(query.toLowerCase()) || t.id.toLowerCase().includes(query.toLowerCase())) as tool}
|
||||
<button
|
||||
class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
goto(`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`);
|
||||
}}
|
||||
>
|
||||
<div class=" flex flex-1 space-x-4 cursor-pointer w-full">
|
||||
<a
|
||||
href={`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`}
|
||||
class="flex items-center text-left"
|
||||
>
|
||||
<div class=" flex-1 self-center pl-5">
|
||||
<div class=" font-semibold flex items-center gap-1.5">
|
||||
<div>
|
||||
{tool.name}
|
||||
</div>
|
||||
<div class=" text-gray-500 text-xs font-medium">{tool.id}</div>
|
||||
</div>
|
||||
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1">
|
||||
{tool.meta.description}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="flex flex-row space-x-1 self-center">
|
||||
<Tooltip content="Edit">
|
||||
<a
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
href={`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip content="Clone">
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={async (e) => {
|
||||
e.stopPropagation();
|
||||
|
||||
const _tool = await getToolById(localStorage.token, tool.id).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (_tool) {
|
||||
sessionStorage.tool = JSON.stringify({
|
||||
..._tool,
|
||||
id: `${_tool.id}_clone`,
|
||||
name: `${_tool.name} (Clone)`
|
||||
});
|
||||
goto('/workspace/tools/create');
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip content="Export">
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={async (e) => {
|
||||
e.stopPropagation();
|
||||
|
||||
const _tool = await getToolById(localStorage.token, tool.id).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (_tool) {
|
||||
let blob = new Blob([JSON.stringify([_tool])], {
|
||||
type: 'application/json'
|
||||
});
|
||||
saveAs(blob, `tool-${_tool.id}-export-${Date.now()}.json`);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<ArrowDownTray />
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip content="Delete">
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={async (e) => {
|
||||
e.stopPropagation();
|
||||
|
||||
const res = await deleteToolById(localStorage.token, tool.id).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success('Tool deleted successfully');
|
||||
tools.set(await getTools(localStorage.token));
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</button>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<div class=" text-gray-500 text-xs mt-1 mb-2">
|
||||
ⓘ {$i18n.t(
|
||||
'Admins have access to all tools at all times; users need tools assigned per model in the workspace.'
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div class=" flex justify-end w-full mb-2">
|
||||
<div class="flex space-x-2">
|
||||
<input
|
||||
id="documents-import-input"
|
||||
bind:this={toolsImportInputElement}
|
||||
bind:files={importFiles}
|
||||
type="file"
|
||||
accept=".json"
|
||||
hidden
|
||||
on:change={() => {
|
||||
console.log(importFiles);
|
||||
showConfirm = true;
|
||||
}}
|
||||
/>
|
||||
|
||||
<button
|
||||
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition"
|
||||
on:click={() => {
|
||||
toolsImportInputElement.click();
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2 font-medium">{$i18n.t('Import Tools')}</div>
|
||||
|
||||
<div class=" self-center">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="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>
|
||||
</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition"
|
||||
on:click={async () => {
|
||||
const _tools = await exportTools(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (_tools) {
|
||||
let blob = new Blob([JSON.stringify(_tools)], {
|
||||
type: 'application/json'
|
||||
});
|
||||
saveAs(blob, `tools-export-${Date.now()}.json`);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2 font-medium">{$i18n.t('Export Tools')}</div>
|
||||
|
||||
<div class=" self-center">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="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 3.5a.75.75 0 0 1 .75.75v2.69l.72-.72a.75.75 0 1 1 1.06 1.06l-2 2a.75.75 0 0 1-1.06 0l-2-2a.75.75 0 0 1 1.06-1.06l.72.72V6.25A.75.75 0 0 1 8 5.5Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ConfirmDialog
|
||||
bind:show={showConfirm}
|
||||
on:confirm={() => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = async (event) => {
|
||||
const _tools = JSON.parse(event.target.result);
|
||||
console.log(_tools);
|
||||
|
||||
for (const tool of _tools) {
|
||||
const res = await createNewTool(localStorage.token, tool).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
toast.success('Tool imported successfully');
|
||||
tools.set(await getTools(localStorage.token));
|
||||
};
|
||||
|
||||
reader.readAsText(importFiles[0]);
|
||||
}}
|
||||
>
|
||||
<div class="text-sm text-gray-500">
|
||||
<div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3">
|
||||
<div>Please carefully review the following warnings:</div>
|
||||
|
||||
<ul class=" mt-1 list-disc pl-4 text-xs">
|
||||
<li>Tools have a function calling system that allows arbitrary code execution.</li>
|
||||
<li>Do not install tools from sources you do not fully trust.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
I acknowledge that I have read and I understand the implications of my action. I am aware of
|
||||
the risks associated with executing arbitrary code and I have verified the trustworthiness of
|
||||
the source.
|
||||
</div>
|
||||
</div>
|
||||
</ConfirmDialog>
|
||||
@@ -0,0 +1,127 @@
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/common/CodeEditor.svelte';
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
export let value = '';
|
||||
|
||||
let codeEditor;
|
||||
let boilerplate = `import os
|
||||
import requests
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class Tools:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
# Add your custom tools using pure Python code here, make sure to add type hints
|
||||
# Use Sphinx-style docstrings to document your tools, they will be used for generating tools specifications
|
||||
# Please refer to function_calling_filter_pipeline.py file from pipelines project for an example
|
||||
|
||||
def get_user_name_and_email_and_id(self, __user__: dict = {}) -> str:
|
||||
"""
|
||||
Get the user name, Email and ID from the user object.
|
||||
"""
|
||||
|
||||
# Do not include :param for __user__ in the docstring as it should not be shown in the tool's specification
|
||||
# The session user object will be passed as a parameter when the function is called
|
||||
|
||||
print(__user__)
|
||||
result = ""
|
||||
|
||||
if "name" in __user__:
|
||||
result += f"User: {__user__['name']}"
|
||||
if "id" in __user__:
|
||||
result += f" (ID: {__user__['id']})"
|
||||
if "email" in __user__:
|
||||
result += f" (Email: {__user__['email']})"
|
||||
|
||||
if result == "":
|
||||
result = "User: Unknown"
|
||||
|
||||
return result
|
||||
|
||||
def get_current_time(self) -> str:
|
||||
"""
|
||||
Get the current time in a more human-readable format.
|
||||
:return: The current time.
|
||||
"""
|
||||
|
||||
now = datetime.now()
|
||||
current_time = now.strftime("%I:%M:%S %p") # Using 12-hour format with AM/PM
|
||||
current_date = now.strftime(
|
||||
"%A, %B %d, %Y"
|
||||
) # Full weekday, month name, day, and year
|
||||
|
||||
return f"Current Date and Time = {current_date}, {current_time}"
|
||||
|
||||
def calculator(self, equation: str) -> str:
|
||||
"""
|
||||
Calculate the result of an equation.
|
||||
:param equation: The equation to calculate.
|
||||
"""
|
||||
|
||||
# Avoid using eval in production code
|
||||
# https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
|
||||
try:
|
||||
result = eval(equation)
|
||||
return f"{equation} = {result}"
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return "Invalid equation"
|
||||
|
||||
def get_current_weather(self, city: str) -> str:
|
||||
"""
|
||||
Get the current weather for a given city.
|
||||
:param city: The name of the city to get the weather for.
|
||||
:return: The current weather information or an error message.
|
||||
"""
|
||||
api_key = os.getenv("OPENWEATHER_API_KEY")
|
||||
if not api_key:
|
||||
return (
|
||||
"API key is not set in the environment variable 'OPENWEATHER_API_KEY'."
|
||||
)
|
||||
|
||||
base_url = "http://api.openweathermap.org/data/2.5/weather"
|
||||
params = {
|
||||
"q": city,
|
||||
"appid": api_key,
|
||||
"units": "metric", # Optional: Use 'imperial' for Fahrenheit
|
||||
}
|
||||
|
||||
try:
|
||||
response = requests.get(base_url, params=params)
|
||||
response.raise_for_status() # Raise HTTPError for bad responses (4xx and 5xx)
|
||||
data = response.json()
|
||||
|
||||
if data.get("cod") != 200:
|
||||
return f"Error fetching weather data: {data.get('message')}"
|
||||
|
||||
weather_description = data["weather"][0]["description"]
|
||||
temperature = data["main"]["temp"]
|
||||
humidity = data["main"]["humidity"]
|
||||
wind_speed = data["wind"]["speed"]
|
||||
|
||||
return f"Weather in {city}: {temperature}°C"
|
||||
except requests.RequestException as e:
|
||||
return f"Error fetching weather data: {str(e)}"
|
||||
`;
|
||||
|
||||
export const formatHandler = async () => {
|
||||
if (codeEditor) {
|
||||
return await codeEditor.formatPythonCodeHandler();
|
||||
}
|
||||
return false;
|
||||
};
|
||||
</script>
|
||||
|
||||
<CodeEditor
|
||||
bind:value
|
||||
{boilerplate}
|
||||
bind:this={codeEditor}
|
||||
on:save={() => {
|
||||
dispatch('save');
|
||||
}}
|
||||
/>
|
||||
@@ -0,0 +1,179 @@
|
||||
<script>
|
||||
import { getContext, createEventDispatcher, onMount } from 'svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
import CodeEditor from './CodeEditor.svelte';
|
||||
import { goto } from '$app/navigation';
|
||||
import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
let formElement = null;
|
||||
let loading = false;
|
||||
let showConfirm = false;
|
||||
|
||||
export let edit = false;
|
||||
export let clone = false;
|
||||
|
||||
export let id = '';
|
||||
export let name = '';
|
||||
export let meta = {
|
||||
description: ''
|
||||
};
|
||||
export let content = '';
|
||||
|
||||
$: if (name && !edit && !clone) {
|
||||
id = name.replace(/\s+/g, '_').toLowerCase();
|
||||
}
|
||||
|
||||
let codeEditor;
|
||||
|
||||
const saveHandler = async () => {
|
||||
loading = true;
|
||||
dispatch('save', {
|
||||
id,
|
||||
name,
|
||||
meta,
|
||||
content
|
||||
});
|
||||
};
|
||||
|
||||
const submitHandler = async () => {
|
||||
if (codeEditor) {
|
||||
const res = await codeEditor.formatHandler();
|
||||
|
||||
if (res) {
|
||||
console.log('Code formatted successfully');
|
||||
saveHandler();
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<div class=" flex flex-col justify-between w-full overflow-y-auto h-full">
|
||||
<div class="mx-auto w-full md:px-0 h-full">
|
||||
<form
|
||||
bind:this={formElement}
|
||||
class=" flex flex-col max-h-[100dvh] h-full"
|
||||
on:submit|preventDefault={() => {
|
||||
if (edit) {
|
||||
submitHandler();
|
||||
} else {
|
||||
showConfirm = true;
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div class="mb-2.5">
|
||||
<button
|
||||
class="flex space-x-1"
|
||||
on:click={() => {
|
||||
goto('/workspace/tools');
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<div class=" self-center">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center font-medium text-sm">{$i18n.t('Back')}</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col flex-1 overflow-auto h-0 rounded-lg">
|
||||
<div class="w-full mb-2 flex flex-col gap-1.5">
|
||||
<div class="flex gap-2 w-full">
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Toolkit Name (e.g. My ToolKit)"
|
||||
bind:value={name}
|
||||
required
|
||||
/>
|
||||
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium disabled:text-gray-300 dark:disabled:text-gray-700 bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Toolkit ID (e.g. my_toolkit)"
|
||||
bind:value={id}
|
||||
required
|
||||
disabled={edit}
|
||||
/>
|
||||
</div>
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Toolkit Description (e.g. A toolkit for performing various operations)"
|
||||
bind:value={meta.description}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="mb-2 flex-1 overflow-auto h-0 rounded-lg">
|
||||
<CodeEditor
|
||||
bind:value={content}
|
||||
bind:this={codeEditor}
|
||||
on:save={() => {
|
||||
if (formElement) {
|
||||
formElement.requestSubmit();
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="pb-3 flex justify-between">
|
||||
<div class="flex-1 pr-3">
|
||||
<div class="text-xs text-gray-500 line-clamp-2">
|
||||
<span class=" font-semibold dark:text-gray-200">Warning:</span> Tools are a function
|
||||
calling system with arbitrary code execution <br />—
|
||||
<span class=" font-medium dark:text-gray-400"
|
||||
>don't install random tools from sources you don't trust.</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="px-3 py-1.5 text-sm font-medium bg-emerald-600 hover:bg-emerald-700 text-gray-50 transition rounded-lg"
|
||||
type="submit"
|
||||
>
|
||||
{$i18n.t('Save')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ConfirmDialog
|
||||
bind:show={showConfirm}
|
||||
on:confirm={() => {
|
||||
submitHandler();
|
||||
}}
|
||||
>
|
||||
<div class="text-sm text-gray-500">
|
||||
<div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3">
|
||||
<div>Please carefully review the following warnings:</div>
|
||||
|
||||
<ul class=" mt-1 list-disc pl-4 text-xs">
|
||||
<li>Tools have a function calling system that allows arbitrary code execution.</li>
|
||||
<li>Do not install tools from sources you do not fully trust.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
I acknowledge that I have read and I understand the implications of my action. I am aware of
|
||||
the risks associated with executing arbitrary code and I have verified the trustworthiness of
|
||||
the source.
|
||||
</div>
|
||||
</div>
|
||||
</ConfirmDialog>
|
||||
@@ -89,7 +89,8 @@ export const SUPPORTED_FILE_EXTENSIONS = [
|
||||
'xls',
|
||||
'xlsx',
|
||||
'pptx',
|
||||
'ppt'
|
||||
'ppt',
|
||||
'msg'
|
||||
];
|
||||
|
||||
// Source: https://kit.svelte.dev/docs/modules#$env-static-public
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "مستخدم",
|
||||
"About": "عن",
|
||||
"Account": "الحساب",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "معلومات دقيقة",
|
||||
"Active Users": "",
|
||||
"Add": "أضف",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "اضافة مستخدم",
|
||||
"Adjusting these settings will apply changes universally to all users.": "سيؤدي ضبط هذه الإعدادات إلى تطبيق التغييرات بشكل عام على كافة المستخدمين",
|
||||
"admin": "المشرف",
|
||||
"Admin": "",
|
||||
"Admin Panel": "لوحة التحكم",
|
||||
"Admin Settings": "اعدادات المشرف",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "التعليمات المتقدمة",
|
||||
"Advanced Params": "المعلمات المتقدمة",
|
||||
"all": "الكل",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "صوتي",
|
||||
"August": "أغسطس",
|
||||
"Auto-playback response": "استجابة التشغيل التلقائي",
|
||||
"Auto-send input after 3 sec.": "إرسال تلقائي للإدخال بعد 3 ثواني.",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 الرابط الرئيسي",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 الرابط مطلوب",
|
||||
"available!": "متاح",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "استجابة خطاء",
|
||||
"Banners": "لافتات",
|
||||
"Base Model (From)": "النموذج الأساسي (من)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "قبل",
|
||||
"Being lazy": "كون كسول",
|
||||
"Brave Search API Key": "مفتاح واجهة برمجة تطبيقات البحث الشجاع",
|
||||
"Bypass SSL verification for Websites": "تجاوز التحقق من SSL للموقع",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "اللغاء",
|
||||
"Capabilities": "قدرات",
|
||||
"Change Password": "تغير الباسورد",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Chunk المتغيرات",
|
||||
"Chunk Size": "Chunk حجم",
|
||||
"Citation": "اقتباس",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "أضغط هنا للمساعدة",
|
||||
"Click here to": "أضغط هنا الانتقال",
|
||||
"Click here to select": "أضغط هنا للاختيار",
|
||||
"Click here to select a csv file.": "أضغط هنا للاختيار ملف csv",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "انقر هنا لاختيار المستندات",
|
||||
"click here.": "أضغط هنا",
|
||||
"Click on the user role button to change a user's role.": "أضغط على أسم الصلاحيات لتغيرها للمستخدم",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "الطلبات المتزامنة",
|
||||
"Confirm Password": "تأكيد كلمة المرور",
|
||||
"Connections": "اتصالات",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "الاتصال",
|
||||
"Context Length": "طول السياق",
|
||||
"Continue Response": "متابعة الرد",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "وضع المحادثة",
|
||||
"Copied shared chat URL to clipboard!": "تم نسخ عنوان URL للدردشة المشتركة إلى الحافظة",
|
||||
"Copy": "نسخ",
|
||||
"Copy last code block": "انسخ كتلة التعليمات البرمجية الأخيرة",
|
||||
"Copy last response": "انسخ الرد الأخير",
|
||||
"Copy Link": "أنسخ الرابط",
|
||||
"Copying to clipboard was successful!": "تم النسخ إلى الحافظة بنجاح",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "قم بإنشاء عبارة موجزة مكونة من 3-5 كلمات كرأس للاستعلام التالي، مع الالتزام الصارم بالحد الأقصى لعدد الكلمات الذي يتراوح بين 3-5 كلمات وتجنب استخدام الكلمة 'عنوان':",
|
||||
"Create a model": "إنشاء نموذج",
|
||||
"Create Account": "إنشاء حساب",
|
||||
"Create new key": "عمل مفتاح جديد",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "مخصص",
|
||||
"Customize models for a specific purpose": "تخصيص النماذج لغرض معين",
|
||||
"Dark": "مظلم",
|
||||
"Dashboard": "",
|
||||
"Database": "قاعدة البيانات",
|
||||
"December": "ديسمبر",
|
||||
"Default": "الإفتراضي",
|
||||
"Default (Automatic1111)": "(Automatic1111) الإفتراضي",
|
||||
"Default (SentenceTransformers)": "(SentenceTransformers) الإفتراضي",
|
||||
"Default (Web API)": "(Web API) الإفتراضي",
|
||||
"Default Model": "النموذج الافتراضي",
|
||||
"Default model updated": "الإفتراضي تحديث الموديل",
|
||||
"Default Prompt Suggestions": "الإفتراضي Prompt الاقتراحات",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "اكتشاف موجه",
|
||||
"Discover, download, and explore custom prompts": "اكتشاف وتنزيل واستكشاف المطالبات المخصصة",
|
||||
"Discover, download, and explore model presets": "اكتشاف وتنزيل واستكشاف الإعدادات المسبقة للنموذج",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "اعرض اسم المستخدم بدلاً منك في الدردشة",
|
||||
"Document": "المستند",
|
||||
"Document Settings": "أعدادات المستند",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "e.g. '30s','10m'. الوحدات الزمنية الصالحة هي 's', 'm', 'h'.",
|
||||
"Edit": "تعديل",
|
||||
"Edit Doc": "تعديل الملف",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "تعديل المستخدم",
|
||||
"Email": "البريد",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "أدخل النتيجة",
|
||||
"Enter Searxng Query URL": "أدخل عنوان URL لاستعلام Searxng",
|
||||
"Enter Serper API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack",
|
||||
"Enter stop sequence": "أدخل تسلسل التوقف",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "أدخل Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "الرابط (e.g. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "URL (e.g. http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "تصدير وثائق الخرائط",
|
||||
"Export Models": "نماذج التصدير",
|
||||
"Export Prompts": "مطالبات التصدير",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "فشل في إنشاء مفتاح API.",
|
||||
"Failed to read clipboard contents": "فشل في قراءة محتويات الحافظة",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "عقوبة التردد",
|
||||
"General": "عام",
|
||||
"General Settings": "الاعدادات العامة",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "إنشاء استعلام بحث",
|
||||
"Generation Info": "معلومات الجيل",
|
||||
"Good Response": "استجابة جيدة",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "استيراد خرائط المستندات",
|
||||
"Import Models": "استيراد النماذج",
|
||||
"Import Prompts": "مطالبات الاستيراد",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "قم بتضمين علامة `-api` عند تشغيل Stable-diffusion-webui",
|
||||
"Info": "معلومات",
|
||||
"Input commands": "إدخال الأوامر",
|
||||
"Install from Github URL": "التثبيت من عنوان URL لجيثب",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "واجهه المستخدم",
|
||||
"Invalid Tag": "تاق غير صالحة",
|
||||
"January": "يناير",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT Token",
|
||||
"Keep Alive": "Keep Alive",
|
||||
"Keyboard shortcuts": "اختصارات لوحة المفاتيح",
|
||||
"Knowledge": "",
|
||||
"Language": "اللغة",
|
||||
"Last Active": "آخر نشاط",
|
||||
"Last Modified": "",
|
||||
"Light": "فاتح",
|
||||
"Listening...": "جاري الاستماع",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "يمكن أن تصدر بعض الأخطاء. لذلك يجب التحقق من المعلومات المهمة",
|
||||
"Local Models": "",
|
||||
"LTR": "من جهة اليسار إلى اليمين",
|
||||
"Made by OpenWebUI Community": "OpenWebUI تم إنشاؤه بواسطة مجتمع ",
|
||||
"Make sure to enclose them with": "تأكد من إرفاقها",
|
||||
"Manage": "",
|
||||
"Manage Models": "إدارة النماذج",
|
||||
"Manage Ollama Models": "Ollama إدارة موديلات ",
|
||||
"Manage Pipelines": "إدارة خطوط الأنابيب",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "تم تحميل النموذج '{{modelName}}' بنجاح",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "النموذج '{{modelTag}}' موجود بالفعل في قائمة الانتظار للتحميل",
|
||||
"Model {{modelId}} not found": "لم يتم العثور على النموذج {{modelId}}.",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "قم بتسمية النموذج الخاص بك",
|
||||
"New Chat": "دردشة جديدة",
|
||||
"New Password": "كلمة المرور الجديدة",
|
||||
"No documents found": "",
|
||||
"No results found": "لا توجد نتايج",
|
||||
"No search query generated": "لم يتم إنشاء استعلام بحث",
|
||||
"No source available": "لا يوجد مصدر متاح",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "أولاما API",
|
||||
"Ollama API disabled": "أولاما API معطلة",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama الاصدار",
|
||||
"On": "تشغيل",
|
||||
"Only": "فقط",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF ملف (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
|
||||
"pending": "قيد الانتظار",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "{{error}} تم رفض الإذن عند الوصول إلى الميكروفون ",
|
||||
"Personalization": "التخصيص",
|
||||
"Pipelines": "خطوط الانابيب",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "أقراء لي",
|
||||
"Record voice": "سجل صوت",
|
||||
"Redirecting you to OpenWebUI Community": "OpenWebUI إعادة توجيهك إلى مجتمع ",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "رفض عندما لا ينبغي أن يكون",
|
||||
"Regenerate": "تجديد",
|
||||
"Release Notes": "ملاحظات الإصدار",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "من اليمين إلى اليسار",
|
||||
"Running": "",
|
||||
"Save": "حفظ",
|
||||
"Save & Create": "حفظ وإنشاء",
|
||||
"Save & Update": "حفظ وتحديث",
|
||||
@@ -399,38 +427,44 @@
|
||||
"Search Documents": "البحث المستندات",
|
||||
"Search Models": "نماذج البحث",
|
||||
"Search Prompts": "أبحث حث",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "عدد نتائج البحث",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_zero": "تم البحث في {{count}} sites_zero",
|
||||
"Searched {{count}} sites_one": "تم البحث في {{count}} sites_one",
|
||||
"Searched {{count}} sites_two": "تم البحث في {{count}} sites_two",
|
||||
"Searched {{count}} sites_few": "تم البحث في {{count}} sites_few",
|
||||
"Searched {{count}} sites_many": "تم البحث في {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "تم البحث في {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "البحث في الويب عن \"{{searchQuery}}\"",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "عنوان URL لاستعلام Searxng",
|
||||
"See readme.md for instructions": "readme.md للحصول على التعليمات",
|
||||
"See what's new": "ما الجديد",
|
||||
"Seed": "Seed",
|
||||
"Select a base model": "حدد نموذجا أساسيا",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "أختار موديل",
|
||||
"Select a model": "أختار الموديل",
|
||||
"Select a pipeline": "حدد مسارا",
|
||||
"Select a pipeline url": "حدد عنوان URL لخط الأنابيب",
|
||||
"Select an Ollama instance": "أختار سيرفر ",
|
||||
"Select Documents": "",
|
||||
"Select model": " أختار موديل",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "النموذج (النماذج) المحددة لا تدعم مدخلات الصور",
|
||||
"Send": "تم",
|
||||
"Send a Message": "يُرجى إدخال طلبك هنا",
|
||||
"Send message": "يُرجى إدخال طلبك هنا.",
|
||||
"September": "سبتمبر",
|
||||
"Serper API Key": "مفتاح واجهة برمجة تطبيقات سيربر",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "مفتاح واجهة برمجة تطبيقات Serpstack",
|
||||
"Server connection verified": "تم التحقق من اتصال الخادم",
|
||||
"Set as default": "الافتراضي",
|
||||
"Set Default Model": "تفعيد الموديل الافتراضي",
|
||||
"Set embedding model (e.g. {{model}})": "ضبط نموذج المتجهات (على سبيل المثال: {{model}})",
|
||||
"Set Image Size": "حجم الصورة",
|
||||
"Set Model": "ضبط النموذج",
|
||||
"Set reranking model (e.g. {{model}})": "ضبط نموذج إعادة الترتيب (على سبيل المثال: {{model}})",
|
||||
"Set Steps": "ضبط الخطوات",
|
||||
"Set Task Model": "تعيين نموذج المهمة",
|
||||
@@ -454,8 +488,8 @@
|
||||
"Source": "المصدر",
|
||||
"Speech recognition error: {{error}}": "{{error}} خطأ في التعرف على الكلام",
|
||||
"Speech-to-Text Engine": "محرك تحويل الكلام إلى نص",
|
||||
"SpeechRecognition API is not supported in this browser.": "API SpeechRecognition غير مدعومة في هذا المتصفح.",
|
||||
"Stop Sequence": "وقف التسلسل",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT اعدادات",
|
||||
"Submit": "إرسال",
|
||||
"Subtitle (e.g. about the Roman Empire)": "(e.g. about the Roman Empire) الترجمة",
|
||||
@@ -465,6 +499,7 @@
|
||||
"System": "النظام",
|
||||
"System Prompt": "محادثة النظام",
|
||||
"Tags": "الوسوم",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "أخبرنا المزيد:",
|
||||
"Temperature": "درجة حرارة",
|
||||
"Template": "نموذج",
|
||||
@@ -474,7 +509,9 @@
|
||||
"Thanks for your feedback!": "شكرا لملاحظاتك!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "يجب أن تكون النتيجة قيمة تتراوح بين 0.0 (0%) و1.0 (100%).",
|
||||
"Theme": "الثيم",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "وهذا يضمن حفظ محادثاتك القيمة بشكل آمن في قاعدة بياناتك الخلفية. شكرًا لك!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "لا تتم مزامنة هذا الإعداد عبر المتصفحات أو الأجهزة.",
|
||||
"Thorough explanation": "شرح شامل",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "ملاحضة: قم بتحديث عدة فتحات متغيرة على التوالي عن طريق الضغط على مفتاح tab في مدخلات الدردشة بعد كل استبدال.",
|
||||
@@ -486,22 +523,31 @@
|
||||
"to": "الى",
|
||||
"To access the available model names for downloading,": "للوصول إلى أسماء الموديلات المتاحة للتنزيل،",
|
||||
"To access the GGUF models available for downloading,": "للوصول إلى الموديلات GGUF المتاحة للتنزيل،",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "الى كتابة المحادثه",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "اليوم",
|
||||
"Toggle settings": "فتح وأغلاق الاعدادات",
|
||||
"Toggle sidebar": "فتح وأغلاق الشريط الجانبي",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "هل تواجه مشكلة في الوصول",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS اعدادات",
|
||||
"TTS Voice": "",
|
||||
"Type": "نوع",
|
||||
"Type Hugging Face Resolve (Download) URL": "اكتب عنوان URL لحل مشكلة الوجه (تنزيل).",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "{{provider}}خطاء أوه! حدثت مشكلة في الاتصال بـ ",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "نوع ملف غير معروف '{{file_type}}', ولكن القبول والتعامل كنص عادي ",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "تحديث ونسخ الرابط",
|
||||
"Update password": "تحديث كلمة المرور",
|
||||
"Upload a GGUF model": "GGUF رفع موديل نوع",
|
||||
"Upload Files": "تحميل الملفات",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "جاري التحميل",
|
||||
"URL Mode": "رابط الموديل",
|
||||
"Use '#' in the prompt input to load and select your documents.": "أستخدم '#' في المحادثة لربطهامن المستندات",
|
||||
@@ -520,6 +566,7 @@
|
||||
"Warning": "تحذير",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "تحذير: إذا قمت بتحديث أو تغيير نموذج التضمين الخاص بك، فستحتاج إلى إعادة استيراد كافة المستندات.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web تحميل اعدادات",
|
||||
"Web Params": "Web تحميل اعدادات",
|
||||
"Web Search": "بحث الويب",
|
||||
@@ -530,18 +577,20 @@
|
||||
"WebUI will make requests to": "سوف يقوم WebUI بتقديم طلبات ل",
|
||||
"What’s New in": "ما هو الجديد",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "عند إيقاف تشغيل السجل، لن تظهر الدردشات الجديدة على هذا المتصفح في سجلك على أي من أجهزتك.",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "مساحة العمل",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "اكتب اقتراحًا سريعًا (على سبيل المثال، من أنت؟)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "اكتب ملخصًا في 50 كلمة يلخص [الموضوع أو الكلمة الرئيسية]",
|
||||
"Yesterday": "أمس",
|
||||
"You": "انت",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "لا يمكنك استنساخ نموذج أساسي",
|
||||
"You have no archived conversations.": "لا تملك محادثات محفوظه",
|
||||
"You have shared this chat": "تم مشاركة هذه المحادثة",
|
||||
"You're a helpful assistant.": "مساعدك المفيد هنا",
|
||||
"You're now logged in.": "لقد قمت الآن بتسجيل الدخول.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube تحميل اعدادات"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "потребител",
|
||||
"About": "Относно",
|
||||
"Account": "Акаунт",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Точни информация",
|
||||
"Active Users": "",
|
||||
"Add": "Добавяне",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Добавяне на потребител",
|
||||
"Adjusting these settings will apply changes universally to all users.": "При промяна на тези настройки промените се прилагат за всички потребители.",
|
||||
"admin": "админ",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Панел на Администратор",
|
||||
"Admin Settings": "Настройки на Администратор",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Разширени Параметри",
|
||||
"Advanced Params": "Разширени параметри",
|
||||
"all": "всички",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Аудио",
|
||||
"August": "Август",
|
||||
"Auto-playback response": "Аувтоматично възпроизвеждане на Отговора",
|
||||
"Auto-send input after 3 sec.": "Аувтоматично изпращане на входа след 3 сек.",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Базов URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Базов URL е задължителен.",
|
||||
"available!": "наличен!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Невалиден отговор от API",
|
||||
"Banners": "Банери",
|
||||
"Base Model (From)": "Базов модел (от)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "преди",
|
||||
"Being lazy": "Да бъдеш мързелив",
|
||||
"Brave Search API Key": "Смел ключ за API за търсене",
|
||||
"Bypass SSL verification for Websites": "Изключване на SSL проверката за сайтове",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Отказ",
|
||||
"Capabilities": "Възможности",
|
||||
"Change Password": "Промяна на Парола",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Chunk Params",
|
||||
"Chunk Size": "Chunk Size",
|
||||
"Citation": "Цитат",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Натиснете тук за помощ.",
|
||||
"Click here to": "Натиснете тук за",
|
||||
"Click here to select": "Натиснете тук, за да изберете",
|
||||
"Click here to select a csv file.": "Натиснете тук, за да изберете csv файл.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Натиснете тук, за да изберете документи.",
|
||||
"click here.": "натиснете тук.",
|
||||
"Click on the user role button to change a user's role.": "Натиснете върху бутона за промяна на ролята на потребителя.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Едновременни искания",
|
||||
"Confirm Password": "Потвърди Парола",
|
||||
"Connections": "Връзки",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Съдържание",
|
||||
"Context Length": "Дължина на Контекста",
|
||||
"Continue Response": "Продължи отговора",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Режим на Чат",
|
||||
"Copied shared chat URL to clipboard!": "Копирана е връзката за чат!",
|
||||
"Copy": "Копирай",
|
||||
"Copy last code block": "Копиране на последен код блок",
|
||||
"Copy last response": "Копиране на последен отговор",
|
||||
"Copy Link": "Копиране на връзка",
|
||||
"Copying to clipboard was successful!": "Копирането в клипборда беше успешно!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Създайте кратка фраза от 3-5 думи като заглавие за следващото запитване, като стриктно спазвате ограничението от 3-5 думи и избягвате използването на думата 'заглавие':",
|
||||
"Create a model": "Създаване на модел",
|
||||
"Create Account": "Създаване на Акаунт",
|
||||
"Create new key": "Създаване на нов ключ",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Персонализиран",
|
||||
"Customize models for a specific purpose": "Персонализиране на модели за конкретна цел",
|
||||
"Dark": "Тъмен",
|
||||
"Dashboard": "",
|
||||
"Database": "База данни",
|
||||
"December": "Декември",
|
||||
"Default": "По подразбиране",
|
||||
"Default (Automatic1111)": "По подразбиране (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "По подразбиране (SentenceTransformers)",
|
||||
"Default (Web API)": "По подразбиране (Web API)",
|
||||
"Default Model": "Модел по подразбиране",
|
||||
"Default model updated": "Моделът по подразбиране е обновен",
|
||||
"Default Prompt Suggestions": "Промпт Предложения по подразбиране",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Откриване на промпт",
|
||||
"Discover, download, and explore custom prompts": "Откриване, сваляне и преглед на персонализирани промптове",
|
||||
"Discover, download, and explore model presets": "Откриване, сваляне и преглед на пресетове на модели",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Показване на потребителското име вместо Вие в чата",
|
||||
"Document": "Документ",
|
||||
"Document Settings": "Документ Настройки",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "напр. '30с','10м'. Валидни единици са 'с', 'м', 'ч'.",
|
||||
"Edit": "Редактиране",
|
||||
"Edit Doc": "Редактиране на документ",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Редактиране на потребител",
|
||||
"Email": "Имейл",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Въведете оценка",
|
||||
"Enter Searxng Query URL": "Въведете URL адреса на заявката на Searxng",
|
||||
"Enter Serper API Key": "Въведете Serper API ключ",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Въведете Serpstack API ключ",
|
||||
"Enter stop sequence": "Въведете стоп последователност",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Въведете Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Въведете URL (напр. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Въведете URL (напр. http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Експортване на документен мапинг",
|
||||
"Export Models": "Експортиране на модели",
|
||||
"Export Prompts": "Експортване на промптове",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Неуспешно създаване на API ключ.",
|
||||
"Failed to read clipboard contents": "Грешка при четене на съдържанието от клипборда",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Наказание за честота",
|
||||
"General": "Основни",
|
||||
"General Settings": "Основни Настройки",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Генериране на заявка за търсене",
|
||||
"Generation Info": "Информация за Генерация",
|
||||
"Good Response": "Добра отговор",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Импортване на документен мапинг",
|
||||
"Import Models": "Импортиране на модели",
|
||||
"Import Prompts": "Импортване на промптове",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui",
|
||||
"Info": "Информация",
|
||||
"Input commands": "Въведете команди",
|
||||
"Install from Github URL": "Инсталиране от URL адреса на Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Интерфейс",
|
||||
"Invalid Tag": "Невалиден тег",
|
||||
"January": "Януари",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT Token",
|
||||
"Keep Alive": "Keep Alive",
|
||||
"Keyboard shortcuts": "Клавиши за бърз достъп",
|
||||
"Knowledge": "",
|
||||
"Language": "Език",
|
||||
"Last Active": "Последни активни",
|
||||
"Last Modified": "",
|
||||
"Light": "Светъл",
|
||||
"Listening...": "Слушам...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLMs могат да правят грешки. Проверете важните данни.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Направено от OpenWebUI общността",
|
||||
"Make sure to enclose them with": "Уверете се, че са заключени с",
|
||||
"Manage": "",
|
||||
"Manage Models": "Управление на Моделите",
|
||||
"Manage Ollama Models": "Управление на Ollama Моделите",
|
||||
"Manage Pipelines": "Управление на тръбопроводи",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Моделът '{{modelName}}' беше успешно свален.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Моделът '{{modelTag}}' е вече в очакване за сваляне.",
|
||||
"Model {{modelId}} not found": "Моделът {{modelId}} не е намерен",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Дайте име на вашия модел",
|
||||
"New Chat": "Нов чат",
|
||||
"New Password": "Нова парола",
|
||||
"No documents found": "",
|
||||
"No results found": "Няма намерени резултати",
|
||||
"No search query generated": "Не е генерирана заявка за търсене",
|
||||
"No source available": "Няма наличен източник",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API деактивиран",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama Версия",
|
||||
"On": "Вкл.",
|
||||
"Only": "Само",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF документ (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
|
||||
"pending": "в очакване",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
|
||||
"Personalization": "Персонализация",
|
||||
"Pipelines": "Тръбопроводи",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Прочети на Голос",
|
||||
"Record voice": "Записване на глас",
|
||||
"Redirecting you to OpenWebUI Community": "Пренасочване към OpenWebUI общността",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Отказано, когато не трябва да бъде",
|
||||
"Regenerate": "Регенериране",
|
||||
"Release Notes": "Бележки по изданието",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Запис",
|
||||
"Save & Create": "Запис & Създаване",
|
||||
"Save & Update": "Запис & Актуализиране",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "Търси Документи",
|
||||
"Search Models": "Търсене на модели",
|
||||
"Search Prompts": "Търси Промптове",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Брой резултати от търсенето",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Търси се в {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Търси се в {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Търсене в уеб за '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL адрес на заявка на Searxng",
|
||||
"See readme.md for instructions": "Виж readme.md за инструкции",
|
||||
"See what's new": "Виж какво е новото",
|
||||
"Seed": "Seed",
|
||||
"Select a base model": "Изберете базов модел",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Изберете режим",
|
||||
"Select a model": "Изберете модел",
|
||||
"Select a pipeline": "Изберете тръбопровод",
|
||||
"Select a pipeline url": "Избор на URL адрес на канал",
|
||||
"Select an Ollama instance": "Изберете Ollama инстанция",
|
||||
"Select Documents": "",
|
||||
"Select model": "Изберете модел",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Избраният(те) модел(и) не поддържа въвеждане на изображения",
|
||||
"Send": "Изпрати",
|
||||
"Send a Message": "Изпращане на Съобщение",
|
||||
"Send message": "Изпращане на съобщение",
|
||||
"September": "Септември",
|
||||
"Serper API Key": "Serper API ключ",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API ключ",
|
||||
"Server connection verified": "Server connection verified",
|
||||
"Set as default": "Задай по подразбиране",
|
||||
"Set Default Model": "Задай Модел По Подразбиране",
|
||||
"Set embedding model (e.g. {{model}})": "Задай embedding model (e.g. {{model}})",
|
||||
"Set Image Size": "Задай Размер на Изображението",
|
||||
"Set Model": "Задай Модел",
|
||||
"Set reranking model (e.g. {{model}})": "Задай reranking model (e.g. {{model}})",
|
||||
"Set Steps": "Задай Стъпки",
|
||||
"Set Task Model": "Задаване на модел на задача",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "Източник",
|
||||
"Speech recognition error: {{error}}": "Speech recognition error: {{error}}",
|
||||
"Speech-to-Text Engine": "Speech-to-Text Engine",
|
||||
"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser.",
|
||||
"Stop Sequence": "Stop Sequence",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT Настройки",
|
||||
"Submit": "Изпращане",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Подтитул (напр. за Римска империя)",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "Система",
|
||||
"System Prompt": "Системен Промпт",
|
||||
"Tags": "Тагове",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Повече информация:",
|
||||
"Temperature": "Температура",
|
||||
"Template": "Шаблон",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "Благодарим ви за вашия отзив!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "The score should be a value between 0.0 (0%) and 1.0 (100%).",
|
||||
"Theme": "Тема",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Това гарантира, че ценните ви разговори се запазват сигурно във вашата бекенд база данни. Благодарим ви!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Тази настройка не се синхронизира между браузъри или устройства.",
|
||||
"Thorough explanation": "Това е подробно описание.",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Съвет: Актуализирайте няколко слота за променливи последователно, като натискате клавиша Tab в чат входа след всяка подмяна.",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "в",
|
||||
"To access the available model names for downloading,": "За да получите достъп до наличните имена на модели за изтегляне,",
|
||||
"To access the GGUF models available for downloading,": "За да получите достъп до GGUF моделите, налични за изтегляне,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "към чат входа.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "днес",
|
||||
"Toggle settings": "Toggle settings",
|
||||
"Toggle sidebar": "Toggle sidebar",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Проблеми с достъпът до Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS Настройки",
|
||||
"TTS Voice": "",
|
||||
"Type": "Вид",
|
||||
"Type Hugging Face Resolve (Download) URL": "Въведете Hugging Face Resolve (Download) URL",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "О, не! Възникна проблем при свързването с {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Непознат файлов тип '{{file_type}}', но се приема и обработва като текст",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Обнови и копирай връзка",
|
||||
"Update password": "Обновяване на парола",
|
||||
"Upload a GGUF model": "Качване на GGUF модел",
|
||||
"Upload Files": "Качване на файлове",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Прогрес на качването",
|
||||
"URL Mode": "URL Mode",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Използвайте '#' във промпта за да заредите и изберете вашите документи.",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "Предупреждение",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Предупреждение: Ако актуализирате или промените вашия модел за вграждане, трябва да повторите импортирането на всички документи.",
|
||||
"Web": "Уеб",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Настройки за зареждане на уеб",
|
||||
"Web Params": "Параметри за уеб",
|
||||
"Web Search": "Търсене в уеб",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "WebUI ще направи заявки към",
|
||||
"What’s New in": "Какво е новото в",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Когато историята е изключена, нови чатове в този браузър ще не се показват в историята на никои от вашия профил.",
|
||||
"Whisper (Local)": "Whisper (Локален)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Работно пространство",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Напиши предложение за промпт (напр. Кой сте вие?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Напиши описание в 50 знака, което описва [тема или ключова дума].",
|
||||
"Yesterday": "вчера",
|
||||
"You": "вие",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "Не можете да клонирате базов модел",
|
||||
"You have no archived conversations.": "Нямате архивирани разговори.",
|
||||
"You have shared this chat": "Вие сте споделели този чат",
|
||||
"You're a helpful assistant.": "Вие сте полезен асистент.",
|
||||
"You're now logged in.": "Сега, вие влязохте в системата.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube Loader Settings"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "একজন ব্যাবহারকারী",
|
||||
"About": "সম্পর্কে",
|
||||
"Account": "একাউন্ট",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "সঠিক তথ্য",
|
||||
"Active Users": "",
|
||||
"Add": "যোগ করুন",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "ইউজার যোগ করুন",
|
||||
"Adjusting these settings will apply changes universally to all users.": "এই সেটিংগুলো পরিবর্তন করলে তা সব ইউজারের উপরেই প্রয়োগ করা হবে",
|
||||
"admin": "এডমিন",
|
||||
"Admin": "",
|
||||
"Admin Panel": "এডমিন প্যানেল",
|
||||
"Admin Settings": "এডমিন সেটিংস",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "এডভান্সড প্যারামিটার্স",
|
||||
"Advanced Params": "অ্যাডভান্সড প্যারাম",
|
||||
"all": "সব",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "অডিও",
|
||||
"August": "আগস্ট",
|
||||
"Auto-playback response": "রেসপন্স অটো-প্লেব্যাক",
|
||||
"Auto-send input after 3 sec.": "৩ সেকেন্ড পর ইনপুট সংয়ক্রিয়ভাবে পাঠান",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 বেজ ইউআরএল",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 বেজ ইউআরএল আবশ্যক",
|
||||
"available!": "উপলব্ধ!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "খারাপ প্রতিক্রিয়া",
|
||||
"Banners": "ব্যানার",
|
||||
"Base Model (From)": "বেস মডেল (থেকে)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "পূর্ববর্তী",
|
||||
"Being lazy": "অলস হওয়া",
|
||||
"Brave Search API Key": "সাহসী অনুসন্ধান API কী",
|
||||
"Bypass SSL verification for Websites": "ওয়েবসাইটের জন্য SSL যাচাই বাতিল করুন",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "বাতিল",
|
||||
"Capabilities": "সক্ষমতা",
|
||||
"Change Password": "পাসওয়ার্ড পরিবর্তন করুন",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "চাঙ্ক প্যারামিটার্স",
|
||||
"Chunk Size": "চাঙ্ক সাইজ",
|
||||
"Citation": "উদ্ধৃতি",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "সাহায্যের জন্য এখানে ক্লিক করুন",
|
||||
"Click here to": "এখানে ক্লিক করুন",
|
||||
"Click here to select": "নির্বাচন করার জন্য এখানে ক্লিক করুন",
|
||||
"Click here to select a csv file.": "একটি csv ফাইল নির্বাচন করার জন্য এখানে ক্লিক করুন",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "ডকুমেন্টগুলো নির্বাচন করার জন্য এখানে ক্লিক করুন",
|
||||
"click here.": "এখানে ক্লিক করুন",
|
||||
"Click on the user role button to change a user's role.": "ইউজারের পদবি পরিবর্তন করার জন্য ইউজারের পদবি বাটনে ক্লিক করুন",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "সমকালীন অনুরোধ",
|
||||
"Confirm Password": "পাসওয়ার্ড নিশ্চিত করুন",
|
||||
"Connections": "কানেকশনগুলো",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "বিষয়বস্তু",
|
||||
"Context Length": "কনটেক্সটের দৈর্ঘ্য",
|
||||
"Continue Response": "যাচাই করুন",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "কথোপকথন মোড",
|
||||
"Copied shared chat URL to clipboard!": "শেয়ারকৃত কথা-ব্যবহারের URL ক্লিপবোর্ডে কপি করা হয়েছে!",
|
||||
"Copy": "অনুলিপি",
|
||||
"Copy last code block": "সর্বশেষ কোড ব্লক কপি করুন",
|
||||
"Copy last response": "সর্বশেষ রেসপন্স কপি করুন",
|
||||
"Copy Link": "লিংক কপি করুন",
|
||||
"Copying to clipboard was successful!": "ক্লিপবোর্ডে কপি করা সফল হয়েছে",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "'title' শব্দটি ব্যবহার না করে নিম্মোক্ত অনুসন্ধানের জন্য সংক্ষেপে সর্বোচ্চ ৩-৫ শব্দের একটি হেডার তৈরি করুন",
|
||||
"Create a model": "একটি মডেল তৈরি করুন",
|
||||
"Create Account": "একাউন্ট তৈরি করুন",
|
||||
"Create new key": "একটি নতুন কী তৈরি করুন",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "কাস্টম",
|
||||
"Customize models for a specific purpose": "একটি নির্দিষ্ট উদ্দেশ্যে মডেল কাস্টমাইজ করুন",
|
||||
"Dark": "ডার্ক",
|
||||
"Dashboard": "",
|
||||
"Database": "ডেটাবেজ",
|
||||
"December": "ডেসেম্বর",
|
||||
"Default": "ডিফল্ট",
|
||||
"Default (Automatic1111)": "ডিফল্ট (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "ডিফল্ট (SentenceTransformers)",
|
||||
"Default (Web API)": "ডিফল্ট (Web API)",
|
||||
"Default Model": "ডিফল্ট মডেল",
|
||||
"Default model updated": "ডিফল্ট মডেল আপডেট হয়েছে",
|
||||
"Default Prompt Suggestions": "ডিফল্ট প্রম্পট সাজেশন",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "একটি প্রম্পট খুঁজে বের করুন",
|
||||
"Discover, download, and explore custom prompts": "কাস্টম প্রম্পটগুলো আবিস্কার, ডাউনলোড এবং এক্সপ্লোর করুন",
|
||||
"Discover, download, and explore model presets": "মডেল প্রিসেটগুলো আবিস্কার, ডাউনলোড এবং এক্সপ্লোর করুন",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "চ্যাটে 'আপনি'-র পরবর্তে ইউজারনেম দেখান",
|
||||
"Document": "ডকুমেন্ট",
|
||||
"Document Settings": "ডকুমেন্ট সেটিংসমূহ",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "যেমন '30s','10m'. সময়ের অনুমোদিত অনুমোদিত এককগুলি হচ্ছে 's', 'm', 'h'.",
|
||||
"Edit": "এডিট করুন",
|
||||
"Edit Doc": "ডকুমেন্ট এডিট করুন",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "ইউজার এডিট করুন",
|
||||
"Email": "ইমেইল",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "স্কোর দিন",
|
||||
"Enter Searxng Query URL": "Searxng ক্যোয়ারী URL লিখুন",
|
||||
"Enter Serper API Key": "Serper API কী লিখুন",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack API কী লিখুন",
|
||||
"Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Top K লিখুন",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "ইউআরএল দিন (যেমন http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "ইউআরএল দিন (যেমন http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং এক্সপোর্ট করুন",
|
||||
"Export Models": "রপ্তানি মডেল",
|
||||
"Export Prompts": "প্রম্পটগুলো একপোর্ট করুন",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API Key তৈরি করা যায়নি।",
|
||||
"Failed to read clipboard contents": "ক্লিপবোর্ডের বিষয়বস্তু পড়া সম্ভব হয়নি",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "ফ্রিকোয়েন্সি পেনাল্টি",
|
||||
"General": "সাধারণ",
|
||||
"General Settings": "সাধারণ সেটিংসমূহ",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "অনুসন্ধান ক্যোয়ারী তৈরি করা হচ্ছে",
|
||||
"Generation Info": "জেনারেশন ইনফো",
|
||||
"Good Response": "ভালো সাড়া",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং ইমপোর্ট করুন",
|
||||
"Import Models": "মডেল আমদানি করুন",
|
||||
"Import Prompts": "প্রম্পটগুলো ইমপোর্ট করুন",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন",
|
||||
"Info": "তথ্য",
|
||||
"Input commands": "ইনপুট কমান্ডস",
|
||||
"Install from Github URL": "Github URL থেকে ইনস্টল করুন",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "ইন্টারফেস",
|
||||
"Invalid Tag": "অবৈধ ট্যাগ",
|
||||
"January": "জানুয়ারী",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT টোকেন",
|
||||
"Keep Alive": "সচল রাখুন",
|
||||
"Keyboard shortcuts": "কিবোর্ড শর্টকাটসমূহ",
|
||||
"Knowledge": "",
|
||||
"Language": "ভাষা",
|
||||
"Last Active": "সর্বশেষ সক্রিয়",
|
||||
"Last Modified": "",
|
||||
"Light": "লাইট",
|
||||
"Listening...": "শুনছে...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLM ভুল করতে পারে। গুরুত্বপূর্ণ তথ্য যাচাই করে নিন।",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "OpenWebUI কমিউনিটিকর্তৃক নির্মিত",
|
||||
"Make sure to enclose them with": "এটা দিয়ে বন্ধনী দিতে ভুলবেন না",
|
||||
"Manage": "",
|
||||
"Manage Models": "মডেলসমূহ ব্যবস্থাপনা করুন",
|
||||
"Manage Ollama Models": "Ollama মডেলসূহ ব্যবস্থাপনা করুন",
|
||||
"Manage Pipelines": "পাইপলাইন পরিচালনা করুন",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' মডেল সফলভাবে ডাউনলোড হয়েছে।",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "{{modelTag}} ডাউনলোডের জন্য আগে থেকেই অপেক্ষমান আছে।",
|
||||
"Model {{modelId}} not found": "{{modelId}} মডেল পাওয়া যায়নি",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "আপনার মডেলের নাম দিন",
|
||||
"New Chat": "নতুন চ্যাট",
|
||||
"New Password": "নতুন পাসওয়ার্ড",
|
||||
"No documents found": "",
|
||||
"No results found": "কোন ফলাফল পাওয়া যায়নি",
|
||||
"No search query generated": "কোনও অনুসন্ধান ক্যোয়ারী উত্পন্ন হয়নি",
|
||||
"No source available": "কোন উৎস পাওয়া যায়নি",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API নিষ্ক্রিয় করা হয়েছে",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama ভার্সন",
|
||||
"On": "চালু",
|
||||
"Only": "শুধুমাত্র",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)",
|
||||
"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
|
||||
"pending": "অপেক্ষমান",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "মাইক্রোফোন ব্যবহারের অনুমতি পাওয়া যায়নি: {{error}}",
|
||||
"Personalization": "ডিজিটাল বাংলা",
|
||||
"Pipelines": "পাইপলাইন",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "পড়াশোনা করুন",
|
||||
"Record voice": "ভয়েস রেকর্ড করুন",
|
||||
"Redirecting you to OpenWebUI Community": "আপনাকে OpenWebUI কমিউনিটিতে পাঠানো হচ্ছে",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "যদি উপযুক্ত নয়, তবে রেজিগেনেট করা হচ্ছে",
|
||||
"Regenerate": "রেজিগেনেট করুন",
|
||||
"Release Notes": "রিলিজ নোটসমূহ",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "রোজ পাইন",
|
||||
"Rosé Pine Dawn": "ভোরের রোজ পাইন",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "সংরক্ষণ",
|
||||
"Save & Create": "সংরক্ষণ এবং তৈরি করুন",
|
||||
"Save & Update": "সংরক্ষণ এবং আপডেট করুন",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "ডকুমেন্টসমূহ অনুসন্ধান করুন",
|
||||
"Search Models": "অনুসন্ধান মডেল",
|
||||
"Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "অনুসন্ধানের ফলাফল গণনা",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "{{কাউন্ট}} অনুসন্ধান করা হয়েছে sites_one",
|
||||
"Searched {{count}} sites_other": "{{কাউন্ট}} অনুসন্ধান করা হয়েছে sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "'{{searchQuery}}' এর জন্য ওয়েবে অনুসন্ধান করা হচ্ছে",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng ক্যোয়ারী URL",
|
||||
"See readme.md for instructions": "নির্দেশিকার জন্য readme.md দেখুন",
|
||||
"See what's new": "নতুন কী আছে দেখুন",
|
||||
"Seed": "সীড",
|
||||
"Select a base model": "একটি বেস মডেল নির্বাচন করুন",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "একটি মডেল নির্বাচন করুন",
|
||||
"Select a model": "একটি মডেল নির্বাচন করুন",
|
||||
"Select a pipeline": "একটি পাইপলাইন নির্বাচন করুন",
|
||||
"Select a pipeline url": "একটি পাইপলাইন URL নির্বাচন করুন",
|
||||
"Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন",
|
||||
"Select Documents": "",
|
||||
"Select model": "মডেল নির্বাচন করুন",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "নির্বাচিত মডেল(গুলি) চিত্র ইনপুট সমর্থন করে না",
|
||||
"Send": "পাঠান",
|
||||
"Send a Message": "একটি মেসেজ পাঠান",
|
||||
"Send message": "মেসেজ পাঠান",
|
||||
"September": "সেপ্টেম্বর",
|
||||
"Serper API Key": "Serper API Key",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API Key",
|
||||
"Server connection verified": "সার্ভার কানেকশন যাচাই করা হয়েছে",
|
||||
"Set as default": "ডিফল্ট হিসেবে নির্ধারণ করুন",
|
||||
"Set Default Model": "ডিফল্ট মডেল নির্ধারণ করুন",
|
||||
"Set embedding model (e.g. {{model}})": "ইমেম্বিং মডেল নির্ধারণ করুন (উদাহরণ {{model}})",
|
||||
"Set Image Size": "ছবির সাইজ নির্ধারণ করুন",
|
||||
"Set Model": "মডেল নির্ধারণ করুন",
|
||||
"Set reranking model (e.g. {{model}})": "রি-র্যাংকিং মডেল নির্ধারণ করুন (উদাহরণ {{model}})",
|
||||
"Set Steps": "পরবর্তী ধাপসমূহ",
|
||||
"Set Task Model": "টাস্ক মডেল সেট করুন",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "উৎস",
|
||||
"Speech recognition error: {{error}}": "স্পিচ রিকগনিশনে সমস্যা: {{error}}",
|
||||
"Speech-to-Text Engine": "স্পিচ-টু-টেক্সট ইঞ্জিন",
|
||||
"SpeechRecognition API is not supported in this browser.": "এই ব্রাউজার স্পিচরিকগনিশন এপিআই সাপোর্ট করে না।",
|
||||
"Stop Sequence": "সিকোয়েন্স থামান",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT সেটিংস",
|
||||
"Submit": "সাবমিট",
|
||||
"Subtitle (e.g. about the Roman Empire)": "সাবটাইটল (রোমান ইম্পার্টের সম্পর্কে)",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "সিস্টেম",
|
||||
"System Prompt": "সিস্টেম প্রম্পট",
|
||||
"Tags": "ট্যাগসমূহ",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "আরও বলুন:",
|
||||
"Temperature": "তাপমাত্রা",
|
||||
"Template": "টেম্পলেট",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "আপনার মতামত ধন্যবাদ!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "স্কোর একটি 0.0 (0%) এবং 1.0 (100%) এর মধ্যে একটি মান হওয়া উচিত।",
|
||||
"Theme": "থিম",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "এটা নিশ্চিত করে যে, আপনার গুরুত্বপূর্ণ আলোচনা নিরাপদে আপনার ব্যাকএন্ড ডেটাবেজে সংরক্ষিত আছে। ধন্যবাদ!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "এই সেটিং অন্যন্য ব্রাউজার বা ডিভাইসের সাথে সিঙ্ক্রোনাইজ নয় না।",
|
||||
"Thorough explanation": "পুঙ্খানুপুঙ্খ ব্যাখ্যা",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "পরামর্শ: একাধিক ভেরিয়েবল স্লট একের পর এক রিপ্লেস করার জন্য চ্যাট ইনপুটে কিবোর্ডের Tab বাটন ব্যবহার করুন।",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "প্রতি",
|
||||
"To access the available model names for downloading,": "ডাউনলোডের জন্য এভেইলএবল মডেলের নামগুলো এক্সেস করতে,",
|
||||
"To access the GGUF models available for downloading,": "ডাউলোডের জন্য এভেইলএবল GGUF মডেলগুলো এক্সেস করতে,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "চ্যাট ইনপুটে",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "আজ",
|
||||
"Toggle settings": "সেটিংস টোগল",
|
||||
"Toggle sidebar": "সাইডবার টোগল",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Ollama এক্সেস করতে সমস্যা হচ্ছে?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS সেটিংসমূহ",
|
||||
"TTS Voice": "",
|
||||
"Type": "টাইপ",
|
||||
"Type Hugging Face Resolve (Download) URL": "Hugging Face থেকে ডাউনলোড করার ইউআরএল টাইপ করুন",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "ওহ-হো! {{provider}} এর সাথে কানেকশনে সমস্যা হয়েছে।",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "অপরিচিত ফাইল ফরম্যাট '{{file_type}}', তবে প্লেইন টেক্সট হিসেবে গ্রহণ করা হলো",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "আপডেট এবং লিংক কপি করুন",
|
||||
"Update password": "পাসওয়ার্ড আপডেট করুন",
|
||||
"Upload a GGUF model": "একটি GGUF মডেল আপলোড করুন",
|
||||
"Upload Files": "ফাইল আপলোড করুন",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "আপলোড হচ্ছে",
|
||||
"URL Mode": "ইউআরএল মোড",
|
||||
"Use '#' in the prompt input to load and select your documents.": "আপনার ডকুমেন্টসমূহ নির্বাচন করার জন্য আপনার প্রম্পট ইনপুটে '# ব্যবহার করুন।",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "সতর্কীকরণ",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "সতর্কীকরণ: আপনি যদি আপনার এম্বেডিং মডেল আপডেট বা পরিবর্তন করেন, তাহলে আপনাকে সমস্ত নথি পুনরায় আমদানি করতে হবে।.",
|
||||
"Web": "ওয়েব",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "ওয়েব লোডার সেটিংস",
|
||||
"Web Params": "ওয়েব প্যারামিটারসমূহ",
|
||||
"Web Search": "ওয়েব অনুসন্ধান",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "WebUI যেখানে রিকোয়েস্ট পাঠাবে",
|
||||
"What’s New in": "এতে নতুন কী",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "যদি হিস্টোরি বন্ধ থাকে তাহলে এই ব্রাউজারের নতুন চ্যাটগুলো আপনার কোন ডিভাইসের হিস্টোরিতেই দেখা যাবে না।",
|
||||
"Whisper (Local)": "Whisper (লোকাল)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "ওয়ার্কস্পেস",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "একটি প্রম্পট সাজেশন লিখুন (যেমন Who are you?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "৫০ শব্দের মধ্যে [topic or keyword] এর একটি সারসংক্ষেপ লিখুন।",
|
||||
"Yesterday": "আগামী",
|
||||
"You": "আপনি",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "আপনি একটি বেস মডেল ক্লোন করতে পারবেন না",
|
||||
"You have no archived conversations.": "আপনার কোনও আর্কাইভ করা কথোপকথন নেই।",
|
||||
"You have shared this chat": "আপনি এই চ্যাটটি শেয়ার করেছেন",
|
||||
"You're a helpful assistant.": "আপনি একজন উপকারী এসিস্ট্যান্ট",
|
||||
"You're now logged in.": "আপনি এখন লগইন করা অবস্থায় আছেন",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "YouTube লোডার সেটিংস"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "un usuari",
|
||||
"About": "Sobre",
|
||||
"Account": "Compte",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Informació precisa",
|
||||
"Active Users": "",
|
||||
"Add": "Afegir",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Afegir Usuari",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Ajustar aquests paràmetres aplicarà canvis de manera universal a tots els usuaris.",
|
||||
"admin": "administrador",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Panell d'Administració",
|
||||
"Admin Settings": "Configuració d'Administració",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Paràmetres Avançats",
|
||||
"Advanced Params": "Paràmetres avançats",
|
||||
"all": "tots",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Àudio",
|
||||
"August": "Agost",
|
||||
"Auto-playback response": "Resposta de reproducció automàtica",
|
||||
"Auto-send input after 3 sec.": "Enviar entrada automàticament després de 3 segons",
|
||||
"AUTOMATIC1111 Base URL": "URL Base AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "Es requereix l'URL Base AUTOMATIC1111.",
|
||||
"available!": "disponible!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Resposta Erroni",
|
||||
"Banners": "Banners",
|
||||
"Base Model (From)": "Model base (des de)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "abans",
|
||||
"Being lazy": "Ser l'estupidez",
|
||||
"Brave Search API Key": "Clau API Brave Search",
|
||||
"Bypass SSL verification for Websites": "Desactivar la verificació SSL per a l'accés a l'Internet",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Cancel·la",
|
||||
"Capabilities": "Capacitats",
|
||||
"Change Password": "Canvia la Contrasenya",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Paràmetres de Blocs",
|
||||
"Chunk Size": "Mida del Bloc",
|
||||
"Citation": "Citació",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Fes clic aquí per ajuda.",
|
||||
"Click here to": "Fes clic aquí per",
|
||||
"Click here to select": "Fes clic aquí per seleccionar",
|
||||
"Click here to select a csv file.": "Fes clic aquí per seleccionar un fitxer csv.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Fes clic aquí per seleccionar documents.",
|
||||
"click here.": "fes clic aquí.",
|
||||
"Click on the user role button to change a user's role.": "Fes clic al botó de rol d'usuari per canviar el rol d'un usuari.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Sol·licituds simultànies",
|
||||
"Confirm Password": "Confirma la Contrasenya",
|
||||
"Connections": "Connexions",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Contingut",
|
||||
"Context Length": "Longitud del Context",
|
||||
"Continue Response": "Continua la Resposta",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Mode de Conversa",
|
||||
"Copied shared chat URL to clipboard!": "S'ha copiat l'URL compartida al porta-retalls!",
|
||||
"Copy": "Copiar",
|
||||
"Copy last code block": "Copia l'últim bloc de codi",
|
||||
"Copy last response": "Copia l'última resposta",
|
||||
"Copy Link": "Copiar l'enllaç",
|
||||
"Copying to clipboard was successful!": "La còpia al porta-retalls ha estat exitosa!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Crea una frase concisa de 3-5 paraules com a capçalera per a la següent consulta, seguint estrictament el límit de 3-5 paraules i evitant l'ús de la paraula 'títol':",
|
||||
"Create a model": "Crear un model",
|
||||
"Create Account": "Crea un Compte",
|
||||
"Create new key": "Crea una nova clau",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Personalitzat",
|
||||
"Customize models for a specific purpose": "Personalitzar models per a un propòsit específic",
|
||||
"Dark": "Fosc",
|
||||
"Dashboard": "",
|
||||
"Database": "Base de Dades",
|
||||
"December": "Desembre",
|
||||
"Default": "Per defecte",
|
||||
"Default (Automatic1111)": "Per defecte (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Per defecte (SentenceTransformers)",
|
||||
"Default (Web API)": "Per defecte (Web API)",
|
||||
"Default Model": "Model per defecte",
|
||||
"Default model updated": "Model per defecte actualitzat",
|
||||
"Default Prompt Suggestions": "Suggeriments de Prompt Per Defecte",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Descobreix un prompt",
|
||||
"Discover, download, and explore custom prompts": "Descobreix, descarrega i explora prompts personalitzats",
|
||||
"Discover, download, and explore model presets": "Descobreix, descarrega i explora presets de models",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Mostra el nom d'usuari en lloc de 'Tu' al Xat",
|
||||
"Document": "Document",
|
||||
"Document Settings": "Configuració de Documents",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ex. '30s','10m'. Les unitats de temps vàlides són 's', 'm', 'h'.",
|
||||
"Edit": "Editar",
|
||||
"Edit Doc": "Edita Document",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Edita Usuari",
|
||||
"Email": "Correu electrònic",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Introdueix el Puntuació",
|
||||
"Enter Searxng Query URL": "Introduïu l'URL de consulta de Searxng",
|
||||
"Enter Serper API Key": "Introduïu la clau de l'API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Introduïu la clau de l'API Serpstack",
|
||||
"Enter stop sequence": "Introdueix la seqüència de parada",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Introdueix Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Introdueix l'URL (p. ex. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Introdueix l'URL (p. ex. http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Exporta el Mapatge de Documents",
|
||||
"Export Models": "Models d'exportació",
|
||||
"Export Prompts": "Exporta Prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "No s'ha pogut crear la clau d'API.",
|
||||
"Failed to read clipboard contents": "No s'ha pogut llegir el contingut del porta-retalls",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Pena de freqüència",
|
||||
"General": "General",
|
||||
"General Settings": "Configuració General",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Generació de consultes de cerca",
|
||||
"Generation Info": "Informació de Generació",
|
||||
"Good Response": "Resposta bona",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Importa el Mapa de Documents",
|
||||
"Import Models": "Models d'importació",
|
||||
"Import Prompts": "Importa Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui",
|
||||
"Info": "Informació",
|
||||
"Input commands": "Entra ordres",
|
||||
"Install from Github URL": "Instal·leu des de l'URL de Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Interfície",
|
||||
"Invalid Tag": "Etiqueta Inválida",
|
||||
"January": "Gener",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "Token JWT",
|
||||
"Keep Alive": "Mantén Actiu",
|
||||
"Keyboard shortcuts": "Dreceres de Teclat",
|
||||
"Knowledge": "",
|
||||
"Language": "Idioma",
|
||||
"Last Active": "Últim Actiu",
|
||||
"Last Modified": "",
|
||||
"Light": "Clar",
|
||||
"Listening...": "Escoltant...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "Els LLMs poden cometre errors. Verifica la informació important.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Creat per la Comunitat OpenWebUI",
|
||||
"Make sure to enclose them with": "Assegura't d'envoltar-los amb",
|
||||
"Manage": "",
|
||||
"Manage Models": "Gestiona Models",
|
||||
"Manage Ollama Models": "Gestiona Models Ollama",
|
||||
"Manage Pipelines": "Gestionar canonades",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Tau de Mirostat",
|
||||
"MMMM DD, YYYY": "DD de MMMM, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "DD de MMMM, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "El model '{{modelName}}' s'ha descarregat amb èxit.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "El model '{{modelTag}}' ja està en cua per ser descarregat.",
|
||||
"Model {{modelId}} not found": "Model {{modelId}} no trobat",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Posa un nom al model",
|
||||
"New Chat": "Xat Nou",
|
||||
"New Password": "Nova Contrasenya",
|
||||
"No documents found": "",
|
||||
"No results found": "No s'han trobat resultats",
|
||||
"No search query generated": "No es genera cap consulta de cerca",
|
||||
"No source available": "Sense font disponible",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "API d'Ollama",
|
||||
"Ollama API disabled": "L'API d'Ollama desactivada",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Versió d'Ollama",
|
||||
"On": "Activat",
|
||||
"Only": "Només",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "Document PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)",
|
||||
"pending": "pendent",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Permís denegat en accedir al micròfon: {{error}}",
|
||||
"Personalization": "Personalització",
|
||||
"Pipelines": "Canonades",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Llegiu al voltant",
|
||||
"Record voice": "Enregistra veu",
|
||||
"Redirecting you to OpenWebUI Community": "Redirigint-te a la Comunitat OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Refusat quan no hauria d'haver-ho",
|
||||
"Regenerate": "Regenerar",
|
||||
"Release Notes": "Notes de la Versió",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Albada Rosé Pine",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Guarda",
|
||||
"Save & Create": "Guarda i Crea",
|
||||
"Save & Update": "Guarda i Actualitza",
|
||||
@@ -399,35 +427,41 @@
|
||||
"Search Documents": "Cerca Documents",
|
||||
"Search Models": "Models de cerca",
|
||||
"Search Prompts": "Cerca Prompts",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Recompte de resultats de cerca",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Cercat {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Cercat {{recompte}} sites_many",
|
||||
"Searched {{count}} sites_other": "Cercat {{recompte}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Cerca a la web de '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng URL de consulta",
|
||||
"See readme.md for instructions": "Consulta el readme.md per a instruccions",
|
||||
"See what's new": "Veure novetats",
|
||||
"Seed": "Llavor",
|
||||
"Select a base model": "Seleccionar un model base",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Selecciona un mode",
|
||||
"Select a model": "Selecciona un model",
|
||||
"Select a pipeline": "Seleccioneu una canonada",
|
||||
"Select a pipeline url": "Seleccionar un URL de canonada",
|
||||
"Select an Ollama instance": "Selecciona una instància d'Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Selecciona un model",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Els models seleccionats no admeten l'entrada d'imatges",
|
||||
"Send": "Envia",
|
||||
"Send a Message": "Envia un Missatge",
|
||||
"Send message": "Envia missatge",
|
||||
"September": "Setembre",
|
||||
"Serper API Key": "Clau API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API Key",
|
||||
"Server connection verified": "Connexió al servidor verificada",
|
||||
"Set as default": "Estableix com a predeterminat",
|
||||
"Set Default Model": "Estableix Model Predeterminat",
|
||||
"Set embedding model (e.g. {{model}})": "Estableix el model d'emboscada (p.ex. {{model}})",
|
||||
"Set Image Size": "Estableix Mida de la Imatge",
|
||||
"Set Model": "Estableix Model",
|
||||
"Set reranking model (e.g. {{model}})": "Estableix el model de reranking (p.ex. {{model}})",
|
||||
"Set Steps": "Estableix Passos",
|
||||
"Set Task Model": "Defineix el model de tasca",
|
||||
@@ -451,8 +485,8 @@
|
||||
"Source": "Font",
|
||||
"Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}",
|
||||
"Speech-to-Text Engine": "Motor de Veu a Text",
|
||||
"SpeechRecognition API is not supported in this browser.": "L'API de Reconèixer Veu no és compatible amb aquest navegador.",
|
||||
"Stop Sequence": "Atura Seqüència",
|
||||
"STT Model": "",
|
||||
"STT Settings": "Configuracions STT",
|
||||
"Submit": "Envia",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Subtítol (per exemple, sobre l'Imperi Romà)",
|
||||
@@ -462,6 +496,7 @@
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Prompt del Sistema",
|
||||
"Tags": "Etiquetes",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Dóna'ns més informació:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Plantilla",
|
||||
@@ -471,7 +506,9 @@
|
||||
"Thanks for your feedback!": "Gràcies pel teu comentari!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "El puntuatge ha de ser un valor entre 0.0 (0%) i 1.0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Això assegura que les teves converses valuoses queden segurament guardades a la teva base de dades backend. Gràcies!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Aquesta configuració no es sincronitza entre navegadors ni dispositius.",
|
||||
"Thorough explanation": "Explacació exhaustiva",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Consell: Actualitza diversos espais de variables consecutivament prement la tecla de tabulació en l'entrada del xat després de cada reemplaçament.",
|
||||
@@ -483,22 +520,31 @@
|
||||
"to": "a",
|
||||
"To access the available model names for downloading,": "Per accedir als noms dels models disponibles per descarregar,",
|
||||
"To access the GGUF models available for downloading,": "Per accedir als models GGUF disponibles per descarregar,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "a l'entrada del xat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Avui",
|
||||
"Toggle settings": "Commuta configuracions",
|
||||
"Toggle sidebar": "Commuta barra lateral",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemes accedint a Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "Configuracions TTS",
|
||||
"TTS Voice": "",
|
||||
"Type": "Tipus",
|
||||
"Type Hugging Face Resolve (Download) URL": "Escriu URL de Resolució (Descàrrega) de Hugging Face",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uf! Hi va haver un problema connectant-se a {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipus d'Arxiu Desconegut '{{file_type}}', però acceptant i tractant com a text pla",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Actualitza i Copia enllaç",
|
||||
"Update password": "Actualitza contrasenya",
|
||||
"Upload a GGUF model": "Puja un model GGUF",
|
||||
"Upload Files": "Pujar fitxers",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Progrés de Càrrega",
|
||||
"URL Mode": "Mode URL",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Utilitza '#' a l'entrada del prompt per carregar i seleccionar els teus documents.",
|
||||
@@ -517,6 +563,7 @@
|
||||
"Warning": "Advertiment",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avís: Si actualitzeu o canvieu el model d'incrustació, haureu de tornar a importar tots els documents.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Configuració del carregador web",
|
||||
"Web Params": "Paràmetres web",
|
||||
"Web Search": "Cercador web",
|
||||
@@ -527,18 +574,20 @@
|
||||
"WebUI will make requests to": "WebUI farà peticions a",
|
||||
"What’s New in": "Què hi ha de Nou en",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quan l'historial està desactivat, els nous xats en aquest navegador no apareixeran en el teu historial en cap dels teus dispositius.",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Treball",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Escriu una suggerència de prompt (p. ex. Qui ets tu?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Escriu un resum en 50 paraules que resumeixi [tema o paraula clau].",
|
||||
"Yesterday": "Ayer",
|
||||
"You": "Tu",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "No es pot clonar un model base",
|
||||
"You have no archived conversations.": "No tens converses arxivades.",
|
||||
"You have shared this chat": "Has compartit aquest xat",
|
||||
"You're a helpful assistant.": "Ets un assistent útil.",
|
||||
"You're now logged in.": "Ara estàs connectat.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Configuració del carregador de Youtube"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "usa ka user",
|
||||
"About": "Mahitungod sa",
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "",
|
||||
"Active Users": "",
|
||||
"Add": "",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Ang pag-adjust niini nga mga setting magamit ang mga pagbag-o sa tanan nga tiggamit.",
|
||||
"admin": "Administrator",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Admin Panel",
|
||||
"Admin Settings": "Mga setting sa administratibo",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "advanced settings",
|
||||
"Advanced Params": "",
|
||||
"all": "tanan",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Audio",
|
||||
"August": "",
|
||||
"Auto-playback response": "Autoplay nga tubag",
|
||||
"Auto-send input after 3 sec.": "Awtomatikong ipadala ang entry pagkahuman sa 3 segundos.",
|
||||
"AUTOMATIC1111 Base URL": "Base URL AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "Ang AUTOMATIC1111 base URL gikinahanglan.",
|
||||
"available!": "magamit!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "",
|
||||
"Banners": "",
|
||||
"Base Model (From)": "",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "",
|
||||
"Being lazy": "",
|
||||
"Brave Search API Key": "",
|
||||
"Bypass SSL verification for Websites": "",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Pagkanselar",
|
||||
"Capabilities": "",
|
||||
"Change Password": "Usba ang password",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Mga Setting sa Block",
|
||||
"Chunk Size": "Gidak-on sa block",
|
||||
"Citation": "Mga kinutlo",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "I-klik dinhi alang sa tabang.",
|
||||
"Click here to": "",
|
||||
"Click here to select": "I-klik dinhi aron makapili",
|
||||
"Click here to select a csv file.": "",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Pag-klik dinhi aron mapili ang mga dokumento.",
|
||||
"click here.": "I-klik dinhi.",
|
||||
"Click on the user role button to change a user's role.": "I-klik ang User Role button aron usbon ang role sa user.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "",
|
||||
"Confirm Password": "Kumpirma ang password",
|
||||
"Connections": "Mga koneksyon",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Kontento",
|
||||
"Context Length": "Ang gitas-on sa konteksto",
|
||||
"Continue Response": "",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Talk mode",
|
||||
"Copied shared chat URL to clipboard!": "",
|
||||
"Copy": "",
|
||||
"Copy last code block": "Kopyaha ang katapusang bloke sa code",
|
||||
"Copy last response": "Kopyaha ang kataposang tubag",
|
||||
"Copy Link": "",
|
||||
"Copying to clipboard was successful!": "Ang pagkopya sa clipboard malampuson!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Paghimo og mugbo nga 3-5 ka pulong nga sentence isip usa ka ulohan alang sa mosunod nga pangutana, hugot nga pagsunod sa 3-5 ka pulong nga limitasyon ug paglikay sa paggamit sa pulong nga 'titulo':",
|
||||
"Create a model": "",
|
||||
"Create Account": "Paghimo og account",
|
||||
"Create new key": "",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Custom",
|
||||
"Customize models for a specific purpose": "",
|
||||
"Dark": "Ngitngit",
|
||||
"Dashboard": "",
|
||||
"Database": "Database",
|
||||
"December": "",
|
||||
"Default": "Pinaagi sa default",
|
||||
"Default (Automatic1111)": "Default (Awtomatiko1111)",
|
||||
"Default (SentenceTransformers)": "",
|
||||
"Default (Web API)": "Default (Web API)",
|
||||
"Default Model": "",
|
||||
"Default model updated": "Gi-update nga default template",
|
||||
"Default Prompt Suggestions": "Default nga prompt nga mga sugyot",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Pagkaplag usa ka prompt",
|
||||
"Discover, download, and explore custom prompts": "Pagdiskubre, pag-download ug pagsuhid sa mga naandan nga pag-aghat",
|
||||
"Discover, download, and explore model presets": "Pagdiskobre, pag-download, ug pagsuhid sa mga preset sa template",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Ipakita ang username imbes nga 'Ikaw' sa Panaghisgutan",
|
||||
"Document": "Dokumento",
|
||||
"Document Settings": "Mga Setting sa Dokumento",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ",
|
||||
"Edit": "",
|
||||
"Edit Doc": "I-edit ang dokumento",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "I-edit ang tiggamit",
|
||||
"Email": "E-mail",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "Pagsulod sa katapusan nga han-ay",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Pagsulod sa Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Pagsulod sa URL (e.g. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "I-export ang pagmapa sa dokumento",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "Export prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "",
|
||||
"Failed to read clipboard contents": "Napakyas sa pagbasa sa sulod sa clipboard",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "",
|
||||
"General": "Heneral",
|
||||
"General Settings": "kinatibuk-ang mga setting",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "",
|
||||
"Generation Info": "",
|
||||
"Good Response": "",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Import nga pagmapa sa dokumento",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "Import prompt",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Iapil ang `--api` nga bandila kung nagdagan nga stable-diffusion-webui",
|
||||
"Info": "",
|
||||
"Input commands": "Pagsulod sa input commands",
|
||||
"Install from Github URL": "",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Interface",
|
||||
"Invalid Tag": "",
|
||||
"January": "",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT token",
|
||||
"Keep Alive": "Padayon nga aktibo",
|
||||
"Keyboard shortcuts": "Mga shortcut sa keyboard",
|
||||
"Knowledge": "",
|
||||
"Language": "Pinulongan",
|
||||
"Last Active": "",
|
||||
"Last Modified": "",
|
||||
"Light": "Kahayag",
|
||||
"Listening...": "Paminaw...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "Ang mga LLM mahimong masayop. ",
|
||||
"Local Models": "",
|
||||
"LTR": "",
|
||||
"Made by OpenWebUI Community": "Gihimo sa komunidad sa OpenWebUI",
|
||||
"Make sure to enclose them with": "Siguruha nga palibutan sila",
|
||||
"Manage": "",
|
||||
"Manage Models": "Pagdumala sa mga templates",
|
||||
"Manage Ollama Models": "Pagdumala sa mga modelo sa Ollama",
|
||||
"Manage Pipelines": "",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Ang modelo'{{modelName}}' malampuson nga na-download.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Ang modelo'{{modelTag}}' naa na sa pila para ma-download.",
|
||||
"Model {{modelId}} not found": "Modelo {{modelId}} wala makit-an",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "",
|
||||
"New Chat": "Bag-ong diskusyon",
|
||||
"New Password": "Bag-ong Password",
|
||||
"No documents found": "",
|
||||
"No results found": "",
|
||||
"No search query generated": "",
|
||||
"No source available": "Walay tinubdan nga anaa",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "",
|
||||
"Ollama API": "",
|
||||
"Ollama API disabled": "",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama nga bersyon",
|
||||
"On": "Gipaandar",
|
||||
"Only": "Lamang",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "",
|
||||
"PDF Extract Images (OCR)": "PDF Image Extraction (OCR)",
|
||||
"pending": "gipugngan",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Gidili ang pagtugot sa dihang nag-access sa mikropono: {{error}}",
|
||||
"Personalization": "",
|
||||
"Pipelines": "",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "",
|
||||
"Record voice": "Irekord ang tingog",
|
||||
"Redirecting you to OpenWebUI Community": "Gi-redirect ka sa komunidad sa OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "",
|
||||
"Regenerate": "",
|
||||
"Release Notes": "Release Notes",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Aube Pine Rosé",
|
||||
"RTL": "",
|
||||
"Running": "",
|
||||
"Save": "Tipigi",
|
||||
"Save & Create": "I-save ug Paghimo",
|
||||
"Save & Update": "I-save ug I-update",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "Pangitaa ang mga dokumento",
|
||||
"Search Models": "",
|
||||
"Search Prompts": "Pangitaa ang mga prompt",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "Tan-awa ang readme.md alang sa mga panudlo",
|
||||
"See what's new": "Tan-awa unsay bag-o",
|
||||
"Seed": "Binhi",
|
||||
"Select a base model": "",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Pagpili og mode",
|
||||
"Select a model": "Pagpili og modelo",
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "Pagpili usa ka pananglitan sa Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Pagpili og modelo",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
"Send": "",
|
||||
"Send a Message": "Magpadala ug mensahe",
|
||||
"Send message": "Magpadala ug mensahe",
|
||||
"September": "",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "Gipamatud-an nga koneksyon sa server",
|
||||
"Set as default": "Define pinaagi sa default",
|
||||
"Set Default Model": "Ibutang ang default template",
|
||||
"Set embedding model (e.g. {{model}})": "",
|
||||
"Set Image Size": "Ibutang ang gidak-on sa hulagway",
|
||||
"Set Model": "I-configure ang template",
|
||||
"Set reranking model (e.g. {{model}})": "",
|
||||
"Set Steps": "Ipasabot ang mga lakang",
|
||||
"Set Task Model": "",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "Tinubdan",
|
||||
"Speech recognition error: {{error}}": "Sayop sa pag-ila sa tingog: {{error}}",
|
||||
"Speech-to-Text Engine": "Engine sa pag-ila sa tingog",
|
||||
"SpeechRecognition API is not supported in this browser.": "Ang SpeechRecognition API wala gisuportahan niini nga browser.",
|
||||
"Stop Sequence": "Pagkasunod-sunod sa pagsira",
|
||||
"STT Model": "",
|
||||
"STT Settings": "Mga setting sa STT",
|
||||
"Submit": "Isumite",
|
||||
"Subtitle (e.g. about the Roman Empire)": "",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Madasig nga Sistema",
|
||||
"Tags": "Mga tag",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Modelo",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Kini nagsiguro nga ang imong bililhon nga mga panag-istoryahanay luwas nga natipig sa imong backend database. ",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Kini nga setting wala mag-sync tali sa mga browser o device.",
|
||||
"Thorough explanation": "",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Sugyot: Pag-update sa daghang variable nga lokasyon nga sunud-sunod pinaagi sa pagpindot sa tab key sa chat entry pagkahuman sa matag puli.",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "adunay",
|
||||
"To access the available model names for downloading,": "Aron ma-access ang mga ngalan sa modelo nga ma-download,",
|
||||
"To access the GGUF models available for downloading,": "Aron ma-access ang mga modelo sa GGUF nga magamit alang sa pag-download,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "sa entrada sa iring.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
"Toggle settings": "I-toggle ang mga setting",
|
||||
"Toggle sidebar": "I-toggle ang sidebar",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Ibabaw nga P",
|
||||
"Trouble accessing Ollama?": "Adunay mga problema sa pag-access sa Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "Mga Setting sa TTS",
|
||||
"TTS Voice": "",
|
||||
"Type": "",
|
||||
"Type Hugging Face Resolve (Download) URL": "Pagsulod sa resolusyon (pag-download) URL Hugging Face",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Wala mailhi nga tipo sa file '{{file_type}}', apan gidawat ug gitratar ingon yano nga teksto",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "",
|
||||
"Update password": "I-update ang password",
|
||||
"Upload a GGUF model": "Pag-upload ug modelo sa GGUF",
|
||||
"Upload Files": "",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Pag-uswag sa Pag-upload",
|
||||
"URL Mode": "URL mode",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Gamita ang '#' sa dali nga pagsulod aron makarga ug mapili ang imong mga dokumento.",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "",
|
||||
"Web Params": "",
|
||||
"Web Search": "",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "Ang WebUI maghimo mga hangyo sa",
|
||||
"What’s New in": "Unsay bag-o sa",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kung ang kasaysayan gipalong, ang mga bag-ong chat sa kini nga browser dili makita sa imong kasaysayan sa bisan unsang mga aparato.",
|
||||
"Whisper (Local)": "Whisper (Lokal)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Pagsulat og gisugyot nga prompt (eg. Kinsa ka?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Pagsulat og 50 ka pulong nga summary nga nagsumaryo [topic o keyword].",
|
||||
"Yesterday": "",
|
||||
"You": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "",
|
||||
"You have no archived conversations.": "",
|
||||
"You have shared this chat": "",
|
||||
"You're a helpful assistant.": "Usa ka ka mapuslanon nga katabang",
|
||||
"You're now logged in.": "Konektado ka na karon.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "",
|
||||
"Youtube Loader Settings": ""
|
||||
}
|
||||
|
||||
@@ -12,8 +12,9 @@
|
||||
"a user": "ein Benutzer",
|
||||
"About": "Über",
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Genaue Information",
|
||||
"Active Users": "",
|
||||
"Active Users": "Aktive Benutzer",
|
||||
"Add": "Hinzufügen",
|
||||
"Add a model id": "Hinzufügen einer Modell-ID",
|
||||
"Add a short description about what this model does": "Fügen Sie eine kurze Beschreibung hinzu, was dieses Modell tut",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "User hinzufügen",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Das Anpassen dieser Einstellungen wirkt sich universell auf alle Benutzer aus.",
|
||||
"admin": "Administrator",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Admin Panel",
|
||||
"Admin Settings": "Admin Einstellungen",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Erweiterte Parameter",
|
||||
"Advanced Params": "Erweiterte Parameter",
|
||||
"all": "Alle",
|
||||
@@ -38,7 +41,7 @@
|
||||
"All Users": "Alle Benutzer",
|
||||
"Allow": "Erlauben",
|
||||
"Allow Chat Deletion": "Chat Löschung erlauben",
|
||||
"Allow non-local voices": "",
|
||||
"Allow non-local voices": "Nicht-lokale Stimmen erlauben",
|
||||
"alphanumeric characters and hyphens": "alphanumerische Zeichen und Bindestriche",
|
||||
"Already have an account?": "Hast du vielleicht schon ein Account?",
|
||||
"an assistant": "ein Assistent",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Audio",
|
||||
"August": "August",
|
||||
"Auto-playback response": "Automatische Wiedergabe der Antwort",
|
||||
"Auto-send input after 3 sec.": "Automatisches Senden der Eingabe nach 3 Sek",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Basis URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Basis URL wird benötigt",
|
||||
"available!": "verfügbar!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Schlechte Antwort",
|
||||
"Banners": "Banner",
|
||||
"Base Model (From)": "Basismodell (von)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "bereits geteilt",
|
||||
"Being lazy": "Faul sein",
|
||||
"Brave Search API Key": "API-Schlüssel für die Brave-Suche",
|
||||
"Bypass SSL verification for Websites": "Bypass SSL-Verifizierung für Websites",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Abbrechen",
|
||||
"Capabilities": "Fähigkeiten",
|
||||
"Change Password": "Passwort ändern",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Chunk Parameter",
|
||||
"Chunk Size": "Chunk Size",
|
||||
"Citation": "Zitate",
|
||||
"Clear memory": "Memory löschen",
|
||||
"Click here for help.": "Klicke hier für Hilfe.",
|
||||
"Click here to": "Klicke hier, um",
|
||||
"Click here to select": "Klicke hier um auszuwählen",
|
||||
"Click here to select a csv file.": "Klicke hier um eine CSV-Datei auszuwählen.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Klicke hier um Dokumente auszuwählen",
|
||||
"click here.": "hier klicken.",
|
||||
"Click on the user role button to change a user's role.": "Klicke auf die Benutzerrollenschaltfläche, um die Rolle eines Benutzers zu ändern.",
|
||||
@@ -105,19 +113,18 @@
|
||||
"Concurrent Requests": "Gleichzeitige Anforderungen",
|
||||
"Confirm Password": "Passwort bestätigen",
|
||||
"Connections": "Verbindungen",
|
||||
"Content": "Inhalt",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Info",
|
||||
"Context Length": "Context Length",
|
||||
"Continue Response": "Antwort fortsetzen",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Konversationsmodus",
|
||||
"Copied shared chat URL to clipboard!": "Geteilte Chat-URL in die Zwischenablage kopiert!",
|
||||
"Copy": "Kopieren",
|
||||
"Copy last code block": "Letzten Codeblock kopieren",
|
||||
"Copy last response": "Letzte Antwort kopieren",
|
||||
"Copy Link": "Link kopieren",
|
||||
"Copying to clipboard was successful!": "Das Kopieren in die Zwischenablage war erfolgreich!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Erstelle einen prägnanten Satz mit 3-5 Wörtern als Überschrift für die folgende Abfrage. Halte dich dabei strikt an die 3-5-Wort-Grenze und vermeide die Verwendung des Wortes Titel:",
|
||||
"Create a model": "Erstellen eines Modells",
|
||||
"Create a model": "Ein Modell erstellen",
|
||||
"Create Account": "Konto erstellen",
|
||||
"Create new key": "Neuen Schlüssel erstellen",
|
||||
"Create new secret key": "Neuen API Schlüssel erstellen",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Benutzerdefiniert",
|
||||
"Customize models for a specific purpose": "Modelle für einen bestimmten Zweck anpassen",
|
||||
"Dark": "Dunkel",
|
||||
"Dashboard": "",
|
||||
"Database": "Datenbank",
|
||||
"December": "Dezember",
|
||||
"Default": "Standard",
|
||||
"Default (Automatic1111)": "Standard (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Standard (SentenceTransformers)",
|
||||
"Default (Web API)": "Standard (Web-API)",
|
||||
"Default Model": "Standardmodell",
|
||||
"Default model updated": "Standardmodell aktualisiert",
|
||||
"Default Prompt Suggestions": "Standard-Prompt-Vorschläge",
|
||||
@@ -154,10 +161,12 @@
|
||||
"Discover a prompt": "Einen Prompt entdecken",
|
||||
"Discover, download, and explore custom prompts": "Benutzerdefinierte Prompts entdecken, herunterladen und erkunden",
|
||||
"Discover, download, and explore model presets": "Modellvorgaben entdecken, herunterladen und erkunden",
|
||||
"Dismissible": "ausblendbar",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Den Benutzernamen anstelle von 'du' im Chat anzeigen",
|
||||
"Document": "Dokument",
|
||||
"Document Settings": "Dokumenteinstellungen",
|
||||
"Documentation": "",
|
||||
"Documentation": "Dokumentation",
|
||||
"Documents": "Dokumente",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "stellt keine externen Verbindungen her, und Deine Daten bleiben sicher auf Deinen lokal gehosteten Server.",
|
||||
"Don't Allow": "Nicht erlauben",
|
||||
@@ -170,9 +179,10 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "z.B. '30s','10m'. Gültige Zeiteinheiten sind 's', 'm', 'h'.",
|
||||
"Edit": "Bearbeiten",
|
||||
"Edit Doc": "Dokument bearbeiten",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Benutzer bearbeiten",
|
||||
"Email": "E-Mail",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Batch Size": "Embedding Batch Größe",
|
||||
"Embedding Model": "Embedding-Modell",
|
||||
"Embedding Model Engine": "Embedding-Modell-Engine",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding-Modell auf \"{{embedding_model}}\" gesetzt",
|
||||
@@ -196,39 +206,44 @@
|
||||
"Enter Score": "Score eingeben",
|
||||
"Enter Searxng Query URL": "Geben Sie die Searxng-Abfrage-URL ein",
|
||||
"Enter Serper API Key": "Serper-API-Schlüssel eingeben",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein",
|
||||
"Enter stop sequence": "Stop-Sequenz eingeben",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Gib Top K ein",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Gib die URL ein (z.B. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Gib die URL ein (z.B. http://localhost:11434)",
|
||||
"Enter Your Email": "Gib deine E-Mail-Adresse ein",
|
||||
"Enter Your Full Name": "Gib deinen vollständigen Namen ein",
|
||||
"Enter Your Password": "Gib dein Passwort ein",
|
||||
"Enter Your Email": "E-Mail-Adresse",
|
||||
"Enter Your Full Name": "Name",
|
||||
"Enter Your Password": "Passwort",
|
||||
"Enter Your Role": "Gebe deine Rolle ein",
|
||||
"Error": "Fehler",
|
||||
"Experimental": "Experimentell",
|
||||
"Export": "Exportieren",
|
||||
"Export All Chats (All Users)": "Alle Chats exportieren (alle Benutzer)",
|
||||
"Export chat (.json)": "",
|
||||
"Export chat (.json)": "Chat exportieren (.json)",
|
||||
"Export Chats": "Chats exportieren",
|
||||
"Export Documents Mapping": "Dokumentenmapping exportieren",
|
||||
"Export Models": "Modelle exportieren",
|
||||
"Export Prompts": "Prompts exportieren",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API Key erstellen fehlgeschlagen",
|
||||
"Failed to read clipboard contents": "Fehler beim Lesen des Zwischenablageninhalts",
|
||||
"Failed to update settings": "",
|
||||
"Failed to update settings": "Fehler beim Aktualisieren der Einstellungen",
|
||||
"February": "Februar",
|
||||
"Feel free to add specific details": "Ergänze Details.",
|
||||
"File Mode": "File Modus",
|
||||
"File not found.": "Datei nicht gefunden.",
|
||||
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Fingerprint spoofing erkannt: Initialen können nicht als Avatar verwendet werden. Es wird auf das Standardprofilbild zurückgegriffen.",
|
||||
"Fluidly stream large external response chunks": "Streamen Sie große externe Antwortblöcke flüssig",
|
||||
"Fluidly stream large external response chunks": "Große externe Antwortblöcke flüssig streamen",
|
||||
"Focus chat input": "Chat-Eingabe fokussieren",
|
||||
"Followed instructions perfectly": "Anweisungen perfekt befolgt",
|
||||
"Format your variables using square brackets like this:": "Formatiere deine Variablen mit eckigen Klammern wie folgt:",
|
||||
"Frequency Penalty": "Frequenz-Strafe",
|
||||
"General": "Allgemein",
|
||||
"General Settings": "Allgemeine Einstellungen",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Suchanfrage generieren",
|
||||
"Generation Info": "Generierungsinformationen",
|
||||
"Good Response": "Gute Antwort",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Dokumentenmapping importieren",
|
||||
"Import Models": "Modelle importieren",
|
||||
"Import Prompts": "Prompts importieren",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Füge das `--api`-Flag hinzu, wenn du stable-diffusion-webui nutzt",
|
||||
"Info": "Info",
|
||||
"Input commands": "Eingabebefehle",
|
||||
"Install from Github URL": "Installieren Sie von der Github-URL",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Benutzeroberfläche",
|
||||
"Invalid Tag": "Ungültiger Tag",
|
||||
"January": "Januar",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT-Token",
|
||||
"Keep Alive": "Keep Alive",
|
||||
"Keyboard shortcuts": "Tastenkürzel",
|
||||
"Knowledge": "",
|
||||
"Language": "Sprache",
|
||||
"Last Active": "Zuletzt aktiv",
|
||||
"Last Modified": "",
|
||||
"Light": "Hell",
|
||||
"Listening...": "Hören...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLMs können Fehler machen. Überprüfe wichtige Informationen.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Von der OpenWebUI-Community",
|
||||
"Make sure to enclose them with": "Formatiere deine Variablen mit:",
|
||||
"Manage": "Verwalten",
|
||||
"Manage Models": "Modelle verwalten",
|
||||
"Manage Ollama Models": "Ollama-Modelle verwalten",
|
||||
"Manage Pipelines": "Verwalten von Pipelines",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "DD MMMM YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "DD MMMM YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Modell '{{modelName}}' wurde erfolgreich heruntergeladen.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Modell '{{modelTag}}' befindet sich bereits in der Warteschlange zum Herunterladen.",
|
||||
"Model {{modelId}} not found": "Modell {{modelId}} nicht gefunden",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Benennen Sie Ihr Modell",
|
||||
"New Chat": "Neuer Chat",
|
||||
"New Password": "Neues Passwort",
|
||||
"No documents found": "",
|
||||
"No results found": "Keine Ergebnisse gefunden",
|
||||
"No search query generated": "Keine Suchanfrage generiert",
|
||||
"No source available": "Keine Quelle verfügbar.",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama-API",
|
||||
"Ollama API disabled": "Ollama-API deaktiviert",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama-Version",
|
||||
"On": "Ein",
|
||||
"Only": "Nur",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF-Dokument (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)",
|
||||
"pending": "ausstehend",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Zugriff auf das Mikrofon verweigert: {{error}}",
|
||||
"Personalization": "Personalisierung",
|
||||
"Pipelines": "Pipelines",
|
||||
@@ -363,11 +389,12 @@
|
||||
"Prompts": "Prompts",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" von Ollama.com herunterladen",
|
||||
"Pull a model from Ollama.com": "Ein Modell von Ollama.com abrufen",
|
||||
"Query Params": "Query Parameter",
|
||||
"RAG Template": "RAG-Vorlage",
|
||||
"Query Params": "Abfrage Parameter",
|
||||
"RAG Template": "RAG-Template",
|
||||
"Read Aloud": "Vorlesen",
|
||||
"Record voice": "Stimme aufnehmen",
|
||||
"Redirecting you to OpenWebUI Community": "Du wirst zur OpenWebUI-Community weitergeleitet",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Abgelehnt, obwohl es nicht hätte sein sollen.",
|
||||
"Regenerate": "Neu generieren",
|
||||
"Release Notes": "Versionshinweise",
|
||||
@@ -379,13 +406,14 @@
|
||||
"Reranking Model": "Reranking Modell",
|
||||
"Reranking model disabled": "Rranking Modell deaktiviert",
|
||||
"Reranking model set to \"{{reranking_model}}\"": "Reranking Modell auf \"{{reranking_model}}\" gesetzt",
|
||||
"Reset Upload Directory": "",
|
||||
"Reset Upload Directory": "Uploadverzeichnis löschen",
|
||||
"Reset Vector Storage": "Vektorspeicher zurücksetzen",
|
||||
"Response AutoCopy to Clipboard": "Antwort automatisch in die Zwischenablage kopieren",
|
||||
"Role": "Rolle",
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "Läuft",
|
||||
"Save": "Speichern",
|
||||
"Save & Create": "Speichern und erstellen",
|
||||
"Save & Update": "Speichern und aktualisieren",
|
||||
@@ -399,47 +427,53 @@
|
||||
"Search Documents": "Dokumente suchen",
|
||||
"Search Models": "Modelle suchen",
|
||||
"Search Prompts": "Prompts suchen",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Anzahl der Suchergebnisse",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Gesucht {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Gesucht {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Suche im Web nach '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng-Abfrage-URL",
|
||||
"See readme.md for instructions": "Anleitung in readme.md anzeigen",
|
||||
"See what's new": "Was gibt's Neues",
|
||||
"Seed": "Seed",
|
||||
"Select a base model": "Wählen Sie ein Basismodell",
|
||||
"Select a engine": "Wähle eine Engine",
|
||||
"Select a mode": "Einen Modus auswählen",
|
||||
"Select a model": "Ein Modell auswählen",
|
||||
"Select a pipeline": "Wählen Sie eine Pipeline aus",
|
||||
"Select a pipeline url": "Auswählen einer Pipeline-URL",
|
||||
"Select an Ollama instance": "Eine Ollama Instanz auswählen",
|
||||
"Select Documents": "",
|
||||
"Select model": "Modell auswählen",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Ausgewählte Modelle unterstützen keine Bildeingaben",
|
||||
"Send": "Senden",
|
||||
"Send a Message": "Eine Nachricht senden",
|
||||
"Send message": "Nachricht senden",
|
||||
"September": "September",
|
||||
"Serper API Key": "Serper-API-Schlüssel",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack-API-Schlüssel",
|
||||
"Server connection verified": "Serververbindung überprüft",
|
||||
"Set as default": "Als Standard festlegen",
|
||||
"Set Default Model": "Standardmodell festlegen",
|
||||
"Set embedding model (e.g. {{model}})": "Eingabemodell festlegen (z.B. {{model}})",
|
||||
"Set Image Size": "Bildgröße festlegen",
|
||||
"Set Model": "Modell festlegen",
|
||||
"Set reranking model (e.g. {{model}})": "Rerankingmodell festlegen (z.B. {{model}})",
|
||||
"Set Steps": "Schritte festlegen",
|
||||
"Set Task Model": "Aufgabenmodell festlegen",
|
||||
"Set Voice": "Stimme festlegen",
|
||||
"Settings": "Einstellungen",
|
||||
"Settings saved successfully!": "Einstellungen erfolgreich gespeichert!",
|
||||
"Settings updated successfully": "",
|
||||
"Settings updated successfully": "Settings updated successfully",
|
||||
"Share": "Teilen",
|
||||
"Share Chat": "Chat teilen",
|
||||
"Share to OpenWebUI Community": "Mit OpenWebUI Community teilen",
|
||||
"short-summary": "kurze-zusammenfassung",
|
||||
"Show": "Anzeigen",
|
||||
"Show Admin Details in Account Pending Overlay": "",
|
||||
"Show Admin Details in Account Pending Overlay": "Admin-Details im Account-Pending-Overlay anzeigen",
|
||||
"Show shortcuts": "Verknüpfungen anzeigen",
|
||||
"Showcased creativity": "Kreativität zur Schau gestellt",
|
||||
"sidebar": "Seitenleiste",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "Quellen",
|
||||
"Speech recognition error: {{error}}": "Spracherkennungsfehler: {{error}}",
|
||||
"Speech-to-Text Engine": "Sprache-zu-Text-Engine",
|
||||
"SpeechRecognition API is not supported in this browser.": "Die Spracherkennungs-API wird in diesem Browser nicht unterstützt.",
|
||||
"Stop Sequence": "Stop Sequence",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT-Einstellungen",
|
||||
"Submit": "Senden",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Untertitel (z.B. über das Römische Reich)",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "System",
|
||||
"System Prompt": "System-Prompt",
|
||||
"Tags": "Tags",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Erzähl uns mehr",
|
||||
"Temperature": "Temperatur",
|
||||
"Template": "Vorlage",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "Danke für dein Feedback",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Der Score sollte ein Wert zwischen 0,0 (0 %) und 1,0 (100 %) sein.",
|
||||
"Theme": "Design",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dadurch werden deine wertvollen Unterhaltungen sicher in der Backend-Datenbank gespeichert. Vielen Dank!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Diese Einstellung wird nicht zwischen Browsern oder Geräten synchronisiert.",
|
||||
"Thorough explanation": "Genaue Erklärung",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tipp: Aktualisiere mehrere Variablen nacheinander, indem du nach jeder Aktualisierung die Tabulatortaste im Chat-Eingabefeld drückst.",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "für",
|
||||
"To access the available model names for downloading,": "Um auf die verfügbaren Modellnamen zum Herunterladen zuzugreifen,",
|
||||
"To access the GGUF models available for downloading,": "Um auf die verfügbaren GGUF Modelle zum Herunterladen zuzugreifen",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "to chat input.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Heute",
|
||||
"Toggle settings": "Einstellungen umschalten",
|
||||
"Toggle sidebar": "Seitenleiste umschalten",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Probleme beim Zugriff auf Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS-Einstellungen",
|
||||
"TTS Voice": "",
|
||||
"Type": "Art",
|
||||
"Type Hugging Face Resolve (Download) URL": "Gib die Hugging Face Resolve (Download) URL ein",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Ups! Es gab ein Problem bei der Verbindung mit {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Unbekannter Dateityp '{{file_type}}', wird jedoch akzeptiert und als einfacher Text behandelt.",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Erneuern und kopieren",
|
||||
"Update password": "Passwort aktualisieren",
|
||||
"Upload a GGUF model": "GGUF Model hochladen",
|
||||
"Upload Files": "Dateien hochladen",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Upload Progress",
|
||||
"URL Mode": "URL Modus",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Verwende '#' in der Prompt-Eingabe, um deine Dokumente zu laden und auszuwählen.",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "Warnung",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Warnung: Wenn du dein Einbettungsmodell aktualisierst oder änderst, musst du alle Dokumente erneut importieren.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web Loader Einstellungen",
|
||||
"Web Params": "Web Parameter",
|
||||
"Web Search": "Websuche",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "Wenn aktiviert sendet WebUI externe Anfragen an",
|
||||
"What’s New in": "Was gibt's Neues in",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Wenn die Historie ausgeschaltet ist, werden neue Chats nicht in deiner Historie auf deine Geräte angezeigt.",
|
||||
"Whisper (Local)": "Whisper (Lokal)",
|
||||
"Widescreen Mode": "",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "Widescreen Modus",
|
||||
"Workspace": "Arbeitsbereich",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Gebe einen Prompt-Vorschlag ein (z.B. Wer bist du?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Schreibe eine kurze Zusammenfassung in 50 Wörtern, die [Thema oder Schlüsselwort] zusammenfasst.",
|
||||
"Yesterday": "Gestern",
|
||||
"You": "Du",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Du kannst deine Interaktionen mit LLMs personalisieren, indem du Erinnerungen durch den 'Verwalten'-Button unten hinzufügst, um sie hilfreicher und auf dich zugeschnitten zu machen.",
|
||||
"You cannot clone a base model": "Sie können ein Basismodell nicht klonen",
|
||||
"You have no archived conversations.": "Du hast keine archivierten Unterhaltungen.",
|
||||
"You have shared this chat": "Du hast diesen Chat",
|
||||
"You're a helpful assistant.": "Du bist ein hilfreicher Assistent.",
|
||||
"You're now logged in.": "Du bist nun eingeloggt.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "YouTube-Ladeeinstellungen"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "such user",
|
||||
"About": "Much About",
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "",
|
||||
"Active Users": "",
|
||||
"Add": "",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Adjusting these settings will apply changes to all users. Such universal, very wow.",
|
||||
"admin": "admin",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Admin Panel",
|
||||
"Admin Settings": "Admin Settings",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Advanced Parameters",
|
||||
"Advanced Params": "",
|
||||
"all": "all",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Audio",
|
||||
"August": "",
|
||||
"Auto-playback response": "Auto-playback response",
|
||||
"Auto-send input after 3 sec.": "Auto-send after 3 sec.",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Base URL is required.",
|
||||
"available!": "available! So excite!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "",
|
||||
"Banners": "",
|
||||
"Base Model (From)": "",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "",
|
||||
"Being lazy": "",
|
||||
"Brave Search API Key": "",
|
||||
"Bypass SSL verification for Websites": "",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Cancel",
|
||||
"Capabilities": "",
|
||||
"Change Password": "Change Password",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Chunk Params",
|
||||
"Chunk Size": "Chunk Size",
|
||||
"Citation": "",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Click for help. Much assist.",
|
||||
"Click here to": "",
|
||||
"Click here to select": "Click to select",
|
||||
"Click here to select a csv file.": "",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Click to select documents",
|
||||
"click here.": "click here. Such click.",
|
||||
"Click on the user role button to change a user's role.": "Click user role button to change role.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "",
|
||||
"Confirm Password": "Confirm Password",
|
||||
"Connections": "Connections",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Content",
|
||||
"Context Length": "Context Length",
|
||||
"Continue Response": "",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Conversation Mode",
|
||||
"Copied shared chat URL to clipboard!": "",
|
||||
"Copy": "",
|
||||
"Copy last code block": "Copy last code block",
|
||||
"Copy last response": "Copy last response",
|
||||
"Copy Link": "",
|
||||
"Copying to clipboard was successful!": "Copying to clipboard was success! Very success!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Create short phrase, 3-5 word, as header for query, much strict, avoid 'title':",
|
||||
"Create a model": "",
|
||||
"Create Account": "Create Account",
|
||||
"Create new key": "",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Custom",
|
||||
"Customize models for a specific purpose": "",
|
||||
"Dark": "Dark",
|
||||
"Dashboard": "",
|
||||
"Database": "Database",
|
||||
"December": "",
|
||||
"Default": "Default",
|
||||
"Default (Automatic1111)": "Default (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "",
|
||||
"Default (Web API)": "Default (Web API)",
|
||||
"Default Model": "",
|
||||
"Default model updated": "Default model much updated",
|
||||
"Default Prompt Suggestions": "Default Prompt Suggestions",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Discover a prompt",
|
||||
"Discover, download, and explore custom prompts": "Discover, download, and explore custom prompts",
|
||||
"Discover, download, and explore model presets": "Discover, download, and explore model presets",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Display username instead of You in Chat",
|
||||
"Document": "Document",
|
||||
"Document Settings": "Document Settings",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "e.g. '30s','10m'. Much time units are 's', 'm', 'h'.",
|
||||
"Edit": "",
|
||||
"Edit Doc": "Edit Doge",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Edit Wowser",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "Enter stop bark",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Enter Top Wow",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Enter URL (e.g. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Export Mappings of Dogos",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "Export Promptos",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "",
|
||||
"Failed to read clipboard contents": "Failed to read clipboard borks",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "",
|
||||
"General": "Woweral",
|
||||
"General Settings": "General Doge Settings",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "",
|
||||
"Generation Info": "",
|
||||
"Good Response": "",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Import Doge Mapping",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "Import Promptos",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Include `--api` flag when running stable-diffusion-webui",
|
||||
"Info": "",
|
||||
"Input commands": "Input commands",
|
||||
"Install from Github URL": "",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Interface",
|
||||
"Invalid Tag": "",
|
||||
"January": "",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT Borken",
|
||||
"Keep Alive": "Keep Wow",
|
||||
"Keyboard shortcuts": "Keyboard Barkcuts",
|
||||
"Knowledge": "",
|
||||
"Language": "Doge Speak",
|
||||
"Last Active": "",
|
||||
"Last Modified": "",
|
||||
"Light": "Light",
|
||||
"Listening...": "Listening...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLMs can make borks. Verify important info.",
|
||||
"Local Models": "",
|
||||
"LTR": "",
|
||||
"Made by OpenWebUI Community": "Made by OpenWebUI Community",
|
||||
"Make sure to enclose them with": "Make sure to enclose them with",
|
||||
"Manage": "",
|
||||
"Manage Models": "Manage Wowdels",
|
||||
"Manage Ollama Models": "Manage Ollama Wowdels",
|
||||
"Manage Pipelines": "",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' has been successfully downloaded.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' is already in queue for downloading.",
|
||||
"Model {{modelId}} not found": "Model {{modelId}} not found",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "",
|
||||
"New Chat": "New Bark",
|
||||
"New Password": "New Barkword",
|
||||
"No documents found": "",
|
||||
"No results found": "",
|
||||
"No search query generated": "",
|
||||
"No source available": "No source available",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "",
|
||||
"Ollama API": "",
|
||||
"Ollama API disabled": "",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama Version",
|
||||
"On": "On",
|
||||
"Only": "Only",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "",
|
||||
"PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)",
|
||||
"pending": "pending",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
|
||||
"Personalization": "Personalization",
|
||||
"Pipelines": "",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "",
|
||||
"Record voice": "Record Bark",
|
||||
"Redirecting you to OpenWebUI Community": "Redirecting you to OpenWebUI Community",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "",
|
||||
"Regenerate": "",
|
||||
"Release Notes": "Release Borks",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "",
|
||||
"Running": "",
|
||||
"Save": "Save much wow",
|
||||
"Save & Create": "Save & Create much create",
|
||||
"Save & Update": "Save & Update much update",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "Search Documents much find",
|
||||
"Search Models": "",
|
||||
"Search Prompts": "Search Prompts much wow",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "See readme.md for instructions wow",
|
||||
"See what's new": "See what's new so amaze",
|
||||
"Seed": "Seed very plant",
|
||||
"Select a base model": "",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Select a mode very choose",
|
||||
"Select a model": "Select a model much choice",
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "Select an Ollama instance very choose",
|
||||
"Select Documents": "",
|
||||
"Select model": "Select model much choice",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
"Send": "",
|
||||
"Send a Message": "Send a Message much message",
|
||||
"Send message": "Send message very send",
|
||||
"September": "",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "Server connection verified much secure",
|
||||
"Set as default": "Set as default very default",
|
||||
"Set Default Model": "Set Default Model much model",
|
||||
"Set embedding model (e.g. {{model}})": "",
|
||||
"Set Image Size": "Set Image Size very size",
|
||||
"Set Model": "Set Model so speak",
|
||||
"Set reranking model (e.g. {{model}})": "",
|
||||
"Set Steps": "Set Steps so many steps",
|
||||
"Set Task Model": "",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "Source",
|
||||
"Speech recognition error: {{error}}": "Speech recognition error: {{error}} so error",
|
||||
"Speech-to-Text Engine": "Speech-to-Text Engine much speak",
|
||||
"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser. Much sad.",
|
||||
"Stop Sequence": "Stop Sequence much stop",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT Settings very settings",
|
||||
"Submit": "Submit much submit",
|
||||
"Subtitle (e.g. about the Roman Empire)": "",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "System very system",
|
||||
"System Prompt": "System Prompt much prompt",
|
||||
"Tags": "Tags very tags",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "",
|
||||
"Temperature": "Temperature very temp",
|
||||
"Template": "Template much template",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"Theme": "Theme much theme",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "This ensures that your valuable conversations are securely saved to your backend database. Thank you! Much secure!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "This setting does not sync across browsers or devices. Very not sync.",
|
||||
"Thorough explanation": "",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement. Much tip!",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "to very to",
|
||||
"To access the available model names for downloading,": "To access the available model names for downloading, much access",
|
||||
"To access the GGUF models available for downloading,": "To access the GGUF models available for downloading, much access",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "to chat input. Very chat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
"Toggle settings": "Toggle settings much toggle",
|
||||
"Toggle sidebar": "Toggle sidebar much toggle",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K very top",
|
||||
"Top P": "Top P very top",
|
||||
"Trouble accessing Ollama?": "Trouble accessing Ollama? Much trouble?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS Settings much settings",
|
||||
"TTS Voice": "",
|
||||
"Type": "",
|
||||
"Type Hugging Face Resolve (Download) URL": "Type Hugging Face Resolve (Download) URL much download",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! There was an issue connecting to {{provider}}. Much uh-oh!",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Unknown File Type '{{file_type}}', but accepting and treating as plain text very unknown",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "",
|
||||
"Update password": "Update password much change",
|
||||
"Upload a GGUF model": "Upload a GGUF model very upload",
|
||||
"Upload Files": "",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Upload Progress much progress",
|
||||
"URL Mode": "URL Mode much mode",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Use '#' in the prompt input to load and select your documents. Much use.",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
|
||||
"Web": "Web very web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "",
|
||||
"Web Params": "",
|
||||
"Web Search": "",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "WebUI will make requests to much request",
|
||||
"What’s New in": "What’s New in much new",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "When history is turned off, new chats on this browser won't appear in your history on any of your devices. Much history.",
|
||||
"Whisper (Local)": "Whisper (Local) much whisper",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Write a prompt suggestion (e.g. Who are you?) much suggest",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Write a summary in 50 words that summarizes [topic or keyword]. Much summarize.",
|
||||
"Yesterday": "",
|
||||
"You": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "",
|
||||
"You have no archived conversations.": "",
|
||||
"You have shared this chat": "",
|
||||
"You're a helpful assistant.": "You're a helpful assistant. Much helpful.",
|
||||
"You're now logged in.": "You're now logged in. Much logged.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "",
|
||||
"Youtube Loader Settings": ""
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "",
|
||||
"About": "",
|
||||
"Account": "",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "",
|
||||
"Active Users": "",
|
||||
"Add": "",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "",
|
||||
"Adjusting these settings will apply changes universally to all users.": "",
|
||||
"admin": "",
|
||||
"Admin": "",
|
||||
"Admin Panel": "",
|
||||
"Admin Settings": "",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "",
|
||||
"Advanced Params": "",
|
||||
"all": "",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "",
|
||||
"August": "",
|
||||
"Auto-playback response": "",
|
||||
"Auto-send input after 3 sec.": "",
|
||||
"AUTOMATIC1111 Base URL": "",
|
||||
"AUTOMATIC1111 Base URL is required.": "",
|
||||
"available!": "",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "",
|
||||
"Banners": "",
|
||||
"Base Model (From)": "",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "",
|
||||
"Being lazy": "",
|
||||
"Brave Search API Key": "",
|
||||
"Bypass SSL verification for Websites": "",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "",
|
||||
"Capabilities": "",
|
||||
"Change Password": "",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "",
|
||||
"Chunk Size": "",
|
||||
"Citation": "",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "",
|
||||
"Click here to": "",
|
||||
"Click here to select": "",
|
||||
"Click here to select a csv file.": "",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "",
|
||||
"click here.": "",
|
||||
"Click on the user role button to change a user's role.": "",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "",
|
||||
"Confirm Password": "",
|
||||
"Connections": "",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "",
|
||||
"Context Length": "",
|
||||
"Continue Response": "",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "",
|
||||
"Copied shared chat URL to clipboard!": "",
|
||||
"Copy": "",
|
||||
"Copy last code block": "",
|
||||
"Copy last response": "",
|
||||
"Copy Link": "",
|
||||
"Copying to clipboard was successful!": "",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "",
|
||||
"Create a model": "",
|
||||
"Create Account": "",
|
||||
"Create new key": "",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "",
|
||||
"Customize models for a specific purpose": "",
|
||||
"Dark": "",
|
||||
"Dashboard": "",
|
||||
"Database": "",
|
||||
"December": "",
|
||||
"Default": "",
|
||||
"Default (Automatic1111)": "",
|
||||
"Default (SentenceTransformers)": "",
|
||||
"Default (Web API)": "",
|
||||
"Default Model": "",
|
||||
"Default model updated": "",
|
||||
"Default Prompt Suggestions": "",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "",
|
||||
"Discover, download, and explore custom prompts": "",
|
||||
"Discover, download, and explore model presets": "",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "",
|
||||
"Document": "",
|
||||
"Document Settings": "",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "",
|
||||
"Edit": "",
|
||||
"Edit Doc": "",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "",
|
||||
"Email": "",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "",
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "",
|
||||
"Failed to read clipboard contents": "",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "",
|
||||
"General": "",
|
||||
"General Settings": "",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "",
|
||||
"Generation Info": "",
|
||||
"Good Response": "",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "",
|
||||
"Info": "",
|
||||
"Input commands": "",
|
||||
"Install from Github URL": "",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "",
|
||||
"Invalid Tag": "",
|
||||
"January": "",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "",
|
||||
"Keep Alive": "",
|
||||
"Keyboard shortcuts": "",
|
||||
"Knowledge": "",
|
||||
"Language": "",
|
||||
"Last Active": "",
|
||||
"Last Modified": "",
|
||||
"Light": "",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "",
|
||||
"Local Models": "",
|
||||
"LTR": "",
|
||||
"Made by OpenWebUI Community": "",
|
||||
"Make sure to enclose them with": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "",
|
||||
"Manage Ollama Models": "",
|
||||
"Manage Pipelines": "",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "",
|
||||
"MMMM DD, YYYY": "",
|
||||
"MMMM DD, YYYY HH:mm": "",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "",
|
||||
"Model {{modelId}} not found": "",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "",
|
||||
"New Chat": "",
|
||||
"New Password": "",
|
||||
"No documents found": "",
|
||||
"No results found": "",
|
||||
"No search query generated": "",
|
||||
"No source available": "",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "",
|
||||
"Ollama API": "",
|
||||
"Ollama API disabled": "",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "",
|
||||
"On": "",
|
||||
"Only": "",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "",
|
||||
"PDF Extract Images (OCR)": "",
|
||||
"pending": "",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "",
|
||||
"Personalization": "",
|
||||
"Pipelines": "",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "",
|
||||
"Record voice": "",
|
||||
"Redirecting you to OpenWebUI Community": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "",
|
||||
"Regenerate": "",
|
||||
"Release Notes": "",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "",
|
||||
"Rosé Pine Dawn": "",
|
||||
"RTL": "",
|
||||
"Running": "",
|
||||
"Save": "",
|
||||
"Save & Create": "",
|
||||
"Save & Update": "",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "",
|
||||
"Search Models": "",
|
||||
"Search Prompts": "",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "",
|
||||
"See what's new": "",
|
||||
"Seed": "",
|
||||
"Select a base model": "",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "",
|
||||
"Select a model": "",
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "",
|
||||
"Select Documents": "",
|
||||
"Select model": "",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
"Send": "",
|
||||
"Send a Message": "",
|
||||
"Send message": "",
|
||||
"September": "",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "",
|
||||
"Set as default": "",
|
||||
"Set Default Model": "",
|
||||
"Set embedding model (e.g. {{model}})": "",
|
||||
"Set Image Size": "",
|
||||
"Set Model": "",
|
||||
"Set reranking model (e.g. {{model}})": "",
|
||||
"Set Steps": "",
|
||||
"Set Task Model": "",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "",
|
||||
"Speech recognition error: {{error}}": "",
|
||||
"Speech-to-Text Engine": "",
|
||||
"SpeechRecognition API is not supported in this browser.": "",
|
||||
"Stop Sequence": "",
|
||||
"STT Model": "",
|
||||
"STT Settings": "",
|
||||
"Submit": "",
|
||||
"Subtitle (e.g. about the Roman Empire)": "",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "",
|
||||
"System Prompt": "",
|
||||
"Tags": "",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "",
|
||||
"Temperature": "",
|
||||
"Template": "",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"Theme": "",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "",
|
||||
"Thorough explanation": "",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "",
|
||||
"To access the available model names for downloading,": "",
|
||||
"To access the GGUF models available for downloading,": "",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
"Toggle settings": "",
|
||||
"Toggle sidebar": "",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "",
|
||||
"Top P": "",
|
||||
"Trouble accessing Ollama?": "",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "",
|
||||
"TTS Voice": "",
|
||||
"Type": "",
|
||||
"Type Hugging Face Resolve (Download) URL": "",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "",
|
||||
"Update password": "",
|
||||
"Upload a GGUF model": "",
|
||||
"Upload Files": "",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "",
|
||||
"URL Mode": "",
|
||||
"Use '#' in the prompt input to load and select your documents.": "",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
|
||||
"Web": "",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "",
|
||||
"Web Params": "",
|
||||
"Web Search": "",
|
||||
@@ -533,11 +580,13 @@
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "",
|
||||
"Yesterday": "",
|
||||
"You": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "",
|
||||
"You have no archived conversations.": "",
|
||||
"You have shared this chat": "",
|
||||
"You're a helpful assistant.": "",
|
||||
"You're now logged in.": "",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "",
|
||||
"Youtube Loader Settings": ""
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "",
|
||||
"About": "",
|
||||
"Account": "",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "",
|
||||
"Active Users": "",
|
||||
"Add": "",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "",
|
||||
"Adjusting these settings will apply changes universally to all users.": "",
|
||||
"admin": "",
|
||||
"Admin": "",
|
||||
"Admin Panel": "",
|
||||
"Admin Settings": "",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "",
|
||||
"Advanced Params": "",
|
||||
"all": "",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "",
|
||||
"August": "",
|
||||
"Auto-playback response": "",
|
||||
"Auto-send input after 3 sec.": "",
|
||||
"AUTOMATIC1111 Base URL": "",
|
||||
"AUTOMATIC1111 Base URL is required.": "",
|
||||
"available!": "",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "",
|
||||
"Banners": "",
|
||||
"Base Model (From)": "",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "",
|
||||
"Being lazy": "",
|
||||
"Brave Search API Key": "",
|
||||
"Bypass SSL verification for Websites": "",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "",
|
||||
"Capabilities": "",
|
||||
"Change Password": "",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "",
|
||||
"Chunk Size": "",
|
||||
"Citation": "",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "",
|
||||
"Click here to": "",
|
||||
"Click here to select": "",
|
||||
"Click here to select a csv file.": "",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "",
|
||||
"click here.": "",
|
||||
"Click on the user role button to change a user's role.": "",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "",
|
||||
"Confirm Password": "",
|
||||
"Connections": "",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "",
|
||||
"Context Length": "",
|
||||
"Continue Response": "",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "",
|
||||
"Copied shared chat URL to clipboard!": "",
|
||||
"Copy": "",
|
||||
"Copy last code block": "",
|
||||
"Copy last response": "",
|
||||
"Copy Link": "",
|
||||
"Copying to clipboard was successful!": "",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "",
|
||||
"Create a model": "",
|
||||
"Create Account": "",
|
||||
"Create new key": "",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "",
|
||||
"Customize models for a specific purpose": "",
|
||||
"Dark": "",
|
||||
"Dashboard": "",
|
||||
"Database": "",
|
||||
"December": "",
|
||||
"Default": "",
|
||||
"Default (Automatic1111)": "",
|
||||
"Default (SentenceTransformers)": "",
|
||||
"Default (Web API)": "",
|
||||
"Default Model": "",
|
||||
"Default model updated": "",
|
||||
"Default Prompt Suggestions": "",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "",
|
||||
"Discover, download, and explore custom prompts": "",
|
||||
"Discover, download, and explore model presets": "",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "",
|
||||
"Document": "",
|
||||
"Document Settings": "",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "",
|
||||
"Edit": "",
|
||||
"Edit Doc": "",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "",
|
||||
"Email": "",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "",
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "",
|
||||
"Failed to read clipboard contents": "",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "",
|
||||
"General": "",
|
||||
"General Settings": "",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "",
|
||||
"Generation Info": "",
|
||||
"Good Response": "",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "",
|
||||
"Info": "",
|
||||
"Input commands": "",
|
||||
"Install from Github URL": "",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "",
|
||||
"Invalid Tag": "",
|
||||
"January": "",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "",
|
||||
"Keep Alive": "",
|
||||
"Keyboard shortcuts": "",
|
||||
"Knowledge": "",
|
||||
"Language": "",
|
||||
"Last Active": "",
|
||||
"Last Modified": "",
|
||||
"Light": "",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "",
|
||||
"Local Models": "",
|
||||
"LTR": "",
|
||||
"Made by OpenWebUI Community": "",
|
||||
"Make sure to enclose them with": "",
|
||||
"Manage": "",
|
||||
"Manage Models": "",
|
||||
"Manage Ollama Models": "",
|
||||
"Manage Pipelines": "",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "",
|
||||
"MMMM DD, YYYY": "",
|
||||
"MMMM DD, YYYY HH:mm": "",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "",
|
||||
"Model {{modelId}} not found": "",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "",
|
||||
"New Chat": "",
|
||||
"New Password": "",
|
||||
"No documents found": "",
|
||||
"No results found": "",
|
||||
"No search query generated": "",
|
||||
"No source available": "",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "",
|
||||
"Ollama API": "",
|
||||
"Ollama API disabled": "",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "",
|
||||
"On": "",
|
||||
"Only": "",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "",
|
||||
"PDF Extract Images (OCR)": "",
|
||||
"pending": "",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "",
|
||||
"Personalization": "",
|
||||
"Pipelines": "",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "",
|
||||
"Record voice": "",
|
||||
"Redirecting you to OpenWebUI Community": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "",
|
||||
"Regenerate": "",
|
||||
"Release Notes": "",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "",
|
||||
"Rosé Pine Dawn": "",
|
||||
"RTL": "",
|
||||
"Running": "",
|
||||
"Save": "",
|
||||
"Save & Create": "",
|
||||
"Save & Update": "",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "",
|
||||
"Search Models": "",
|
||||
"Search Prompts": "",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "",
|
||||
"See what's new": "",
|
||||
"Seed": "",
|
||||
"Select a base model": "",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "",
|
||||
"Select a model": "",
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "",
|
||||
"Select Documents": "",
|
||||
"Select model": "",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
"Send": "",
|
||||
"Send a Message": "",
|
||||
"Send message": "",
|
||||
"September": "",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "",
|
||||
"Set as default": "",
|
||||
"Set Default Model": "",
|
||||
"Set embedding model (e.g. {{model}})": "",
|
||||
"Set Image Size": "",
|
||||
"Set Model": "",
|
||||
"Set reranking model (e.g. {{model}})": "",
|
||||
"Set Steps": "",
|
||||
"Set Task Model": "",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "",
|
||||
"Speech recognition error: {{error}}": "",
|
||||
"Speech-to-Text Engine": "",
|
||||
"SpeechRecognition API is not supported in this browser.": "",
|
||||
"Stop Sequence": "",
|
||||
"STT Model": "",
|
||||
"STT Settings": "",
|
||||
"Submit": "",
|
||||
"Subtitle (e.g. about the Roman Empire)": "",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "",
|
||||
"System Prompt": "",
|
||||
"Tags": "",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "",
|
||||
"Temperature": "",
|
||||
"Template": "",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"Theme": "",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "",
|
||||
"Thorough explanation": "",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "",
|
||||
"To access the available model names for downloading,": "",
|
||||
"To access the GGUF models available for downloading,": "",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
"Toggle settings": "",
|
||||
"Toggle sidebar": "",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "",
|
||||
"Top P": "",
|
||||
"Trouble accessing Ollama?": "",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "",
|
||||
"TTS Voice": "",
|
||||
"Type": "",
|
||||
"Type Hugging Face Resolve (Download) URL": "",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "",
|
||||
"Update password": "",
|
||||
"Upload a GGUF model": "",
|
||||
"Upload Files": "",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "",
|
||||
"URL Mode": "",
|
||||
"Use '#' in the prompt input to load and select your documents.": "",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
|
||||
"Web": "",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "",
|
||||
"Web Params": "",
|
||||
"Web Search": "",
|
||||
@@ -533,11 +580,13 @@
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "",
|
||||
"Yesterday": "",
|
||||
"You": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "",
|
||||
"You have no archived conversations.": "",
|
||||
"You have shared this chat": "",
|
||||
"You're a helpful assistant.": "",
|
||||
"You're now logged in.": "",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "",
|
||||
"Youtube Loader Settings": ""
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "un usuario",
|
||||
"About": "Sobre nosotros",
|
||||
"Account": "Cuenta",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Información precisa",
|
||||
"Active Users": "",
|
||||
"Add": "Agregar",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Agregar Usuario",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Ajustar estas opciones aplicará los cambios universalmente a todos los usuarios.",
|
||||
"admin": "admin",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Panel de Administración",
|
||||
"Admin Settings": "Configuración de Administrador",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Parámetros Avanzados",
|
||||
"Advanced Params": "Parámetros avanzados",
|
||||
"all": "todo",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Audio",
|
||||
"August": "Agosto",
|
||||
"Auto-playback response": "Respuesta de reproducción automática",
|
||||
"Auto-send input after 3 sec.": "Envía la información entrada automáticamente luego de 3 segundos.",
|
||||
"AUTOMATIC1111 Base URL": "Dirección URL de AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "La dirección URL de AUTOMATIC1111 es requerida.",
|
||||
"available!": "¡disponible!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Respuesta incorrecta",
|
||||
"Banners": "Banners",
|
||||
"Base Model (From)": "Modelo base (desde)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "antes",
|
||||
"Being lazy": "Ser perezoso",
|
||||
"Brave Search API Key": "Clave de API de Brave Search",
|
||||
"Bypass SSL verification for Websites": "Desactivar la verificación SSL para sitios web",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Cancelar",
|
||||
"Capabilities": "Capacidades",
|
||||
"Change Password": "Cambia la Contraseña",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Parámetros de fragmentos",
|
||||
"Chunk Size": "Tamaño de fragmentos",
|
||||
"Citation": "Cita",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Presiona aquí para obtener ayuda.",
|
||||
"Click here to": "Presiona aquí para",
|
||||
"Click here to select": "Presiona aquí para seleccionar",
|
||||
"Click here to select a csv file.": "Presiona aquí para seleccionar un archivo csv.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Presiona aquí para seleccionar documentos",
|
||||
"click here.": "Presiona aquí.",
|
||||
"Click on the user role button to change a user's role.": "Presiona en el botón de roles del usuario para cambiar su rol.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Solicitudes simultáneas",
|
||||
"Confirm Password": "Confirmar Contraseña",
|
||||
"Connections": "Conexiones",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Contenido",
|
||||
"Context Length": "Longitud del contexto",
|
||||
"Continue Response": "Continuar Respuesta",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Modo de Conversación",
|
||||
"Copied shared chat URL to clipboard!": "¡URL de chat compartido copiado al portapapeles!",
|
||||
"Copy": "Copiar",
|
||||
"Copy last code block": "Copia el último bloque de código",
|
||||
"Copy last response": "Copia la última respuesta",
|
||||
"Copy Link": "Copiar enlace",
|
||||
"Copying to clipboard was successful!": "¡La copia al portapapeles se ha realizado correctamente!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Cree una frase concisa de 3 a 5 palabras como encabezado para la siguiente consulta, respetando estrictamente el límite de 3 a 5 palabras y evitando el uso de la palabra 'título':",
|
||||
"Create a model": "Crear un modelo",
|
||||
"Create Account": "Crear una cuenta",
|
||||
"Create new key": "Crear una nueva clave",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Personalizado",
|
||||
"Customize models for a specific purpose": "Personalizar modelos para un propósito específico",
|
||||
"Dark": "Oscuro",
|
||||
"Dashboard": "",
|
||||
"Database": "Base de datos",
|
||||
"December": "Diciembre",
|
||||
"Default": "Por defecto",
|
||||
"Default (Automatic1111)": "Por defecto (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Por defecto (SentenceTransformers)",
|
||||
"Default (Web API)": "Por defecto (Web API)",
|
||||
"Default Model": "Modelo predeterminado",
|
||||
"Default model updated": "El modelo por defecto ha sido actualizado",
|
||||
"Default Prompt Suggestions": "Sugerencias de mensajes por defecto",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Descubre un Prompt",
|
||||
"Discover, download, and explore custom prompts": "Descubre, descarga, y explora Prompts personalizados",
|
||||
"Discover, download, and explore model presets": "Descubre, descarga y explora ajustes preestablecidos de modelos",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Mostrar el nombre de usuario en lugar de Usted en el chat",
|
||||
"Document": "Documento",
|
||||
"Document Settings": "Configuración del Documento",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p.ej. '30s','10m'. Unidades válidas de tiempo son 's', 'm', 'h'.",
|
||||
"Edit": "Editar",
|
||||
"Edit Doc": "Editar Documento",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Editar Usuario",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Ingrese la puntuación",
|
||||
"Enter Searxng Query URL": "Introduzca la URL de consulta de Searxng",
|
||||
"Enter Serper API Key": "Ingrese la clave API de Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Ingrese la clave API de Serpstack",
|
||||
"Enter stop sequence": "Ingrese la secuencia de parada",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Ingrese el Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Ingrese la URL (p.ej., http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Ingrese la URL (p.ej., http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Exportar el mapeo de documentos",
|
||||
"Export Models": "Modelos de exportación",
|
||||
"Export Prompts": "Exportar Prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "No se pudo crear la clave API.",
|
||||
"Failed to read clipboard contents": "No se pudo leer el contenido del portapapeles",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Penalización de frecuencia",
|
||||
"General": "General",
|
||||
"General Settings": "Opciones Generales",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Generación de consultas de búsqueda",
|
||||
"Generation Info": "Información de Generación",
|
||||
"Good Response": "Buena Respuesta",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Importar Mapeo de Documentos",
|
||||
"Import Models": "Importar modelos",
|
||||
"Import Prompts": "Importar Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Incluir el indicador `--api` al ejecutar stable-diffusion-webui",
|
||||
"Info": "Información",
|
||||
"Input commands": "Ingresar comandos",
|
||||
"Install from Github URL": "Instalar desde la URL de Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Interfaz",
|
||||
"Invalid Tag": "Etiqueta Inválida",
|
||||
"January": "Enero",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "Token JWT",
|
||||
"Keep Alive": "Mantener Vivo",
|
||||
"Keyboard shortcuts": "Atajos de teclado",
|
||||
"Knowledge": "",
|
||||
"Language": "Lenguaje",
|
||||
"Last Active": "Última Actividad",
|
||||
"Last Modified": "",
|
||||
"Light": "Claro",
|
||||
"Listening...": "Escuchando...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "Los LLM pueden cometer errores. Verifica la información importante.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Hecho por la comunidad de OpenWebUI",
|
||||
"Make sure to enclose them with": "Asegúrese de adjuntarlos con",
|
||||
"Manage": "",
|
||||
"Manage Models": "Administrar Modelos",
|
||||
"Manage Ollama Models": "Administrar Modelos Ollama",
|
||||
"Manage Pipelines": "Administrar canalizaciones",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "El modelo '{{modelName}}' se ha descargado correctamente.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "El modelo '{{modelTag}}' ya está en cola para descargar.",
|
||||
"Model {{modelId}} not found": "El modelo {{modelId}} no fue encontrado",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Asigne un nombre a su modelo",
|
||||
"New Chat": "Nuevo Chat",
|
||||
"New Password": "Nueva Contraseña",
|
||||
"No documents found": "",
|
||||
"No results found": "No se han encontrado resultados",
|
||||
"No search query generated": "No se ha generado ninguna consulta de búsqueda",
|
||||
"No source available": "No hay fuente disponible",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "API de Ollama deshabilitada",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Versión de Ollama",
|
||||
"On": "Activado",
|
||||
"Only": "Solamente",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF document (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
|
||||
"pending": "pendiente",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Permiso denegado al acceder al micrófono: {{error}}",
|
||||
"Personalization": "Personalización",
|
||||
"Pipelines": "Tuberías",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Leer al oído",
|
||||
"Record voice": "Grabar voz",
|
||||
"Redirecting you to OpenWebUI Community": "Redireccionándote a la comunidad OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Rechazado cuando no debería",
|
||||
"Regenerate": "Regenerar",
|
||||
"Release Notes": "Notas de la versión",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Guardar",
|
||||
"Save & Create": "Guardar y Crear",
|
||||
"Save & Update": "Guardar y Actualizar",
|
||||
@@ -399,35 +427,41 @@
|
||||
"Search Documents": "Buscar Documentos",
|
||||
"Search Models": "Modelos de búsqueda",
|
||||
"Search Prompts": "Buscar Prompts",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Recuento de resultados de búsqueda",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Buscado {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Buscado {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Buscó {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Buscando en la web '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng URL de consulta",
|
||||
"See readme.md for instructions": "Vea el readme.md para instrucciones",
|
||||
"See what's new": "Ver las novedades",
|
||||
"Seed": "Seed",
|
||||
"Select a base model": "Seleccionar un modelo base",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Selecciona un modo",
|
||||
"Select a model": "Selecciona un modelo",
|
||||
"Select a pipeline": "Selección de una canalización",
|
||||
"Select a pipeline url": "Selección de una dirección URL de canalización",
|
||||
"Select an Ollama instance": "Seleccione una instancia de Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Selecciona un modelo",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Los modelos seleccionados no admiten entradas de imagen",
|
||||
"Send": "Enviar",
|
||||
"Send a Message": "Enviar un Mensaje",
|
||||
"Send message": "Enviar Mensaje",
|
||||
"September": "Septiembre",
|
||||
"Serper API Key": "Clave API de Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Clave API de Serpstack",
|
||||
"Server connection verified": "Conexión del servidor verificada",
|
||||
"Set as default": "Establecer por defecto",
|
||||
"Set Default Model": "Establecer modelo predeterminado",
|
||||
"Set embedding model (e.g. {{model}})": "Establecer modelo de embedding (ej. {{model}})",
|
||||
"Set Image Size": "Establecer tamaño de imagen",
|
||||
"Set Model": "Establecer el modelo",
|
||||
"Set reranking model (e.g. {{model}})": "Establecer modelo de reranking (ej. {{model}})",
|
||||
"Set Steps": "Establecer Pasos",
|
||||
"Set Task Model": "Establecer modelo de tarea",
|
||||
@@ -451,8 +485,8 @@
|
||||
"Source": "Fuente",
|
||||
"Speech recognition error: {{error}}": "Error de reconocimiento de voz: {{error}}",
|
||||
"Speech-to-Text Engine": "Motor de voz a texto",
|
||||
"SpeechRecognition API is not supported in this browser.": "La API SpeechRecognition no es compatible con este navegador.",
|
||||
"Stop Sequence": "Detener secuencia",
|
||||
"STT Model": "",
|
||||
"STT Settings": "Configuraciones de STT",
|
||||
"Submit": "Enviar",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Subtítulo (por ejemplo, sobre el Imperio Romano)",
|
||||
@@ -462,6 +496,7 @@
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Prompt del sistema",
|
||||
"Tags": "Etiquetas",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Dinos más:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Plantilla",
|
||||
@@ -471,7 +506,9 @@
|
||||
"Thanks for your feedback!": "¡Gracias por tu retroalimentación!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "El puntaje debe ser un valor entre 0.0 (0%) y 1.0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Esto garantiza que sus valiosas conversaciones se guarden de forma segura en su base de datos en el backend. ¡Gracias!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Esta configuración no se sincroniza entre navegadores o dispositivos.",
|
||||
"Thorough explanation": "Explicación exhaustiva",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Consejo: Actualice múltiples variables consecutivamente presionando la tecla tab en la entrada del chat después de cada reemplazo.",
|
||||
@@ -483,22 +520,31 @@
|
||||
"to": "para",
|
||||
"To access the available model names for downloading,": "Para acceder a los nombres de modelos disponibles para descargar,",
|
||||
"To access the GGUF models available for downloading,": "Para acceder a los modelos GGUF disponibles para descargar,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "a la entrada del chat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Hoy",
|
||||
"Toggle settings": "Alternar configuración",
|
||||
"Toggle sidebar": "Alternar barra lateral",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "¿Problemas para acceder a Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "Configuración de TTS",
|
||||
"TTS Voice": "",
|
||||
"Type": "Tipo",
|
||||
"Type Hugging Face Resolve (Download) URL": "Escriba la URL (Descarga) de Hugging Face Resolve",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "¡Uh oh! Hubo un problema al conectarse a {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo de archivo desconocido '{{file_type}}', pero se acepta y se trata como texto sin formato",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Actualizar y copiar enlace",
|
||||
"Update password": "Actualizar contraseña",
|
||||
"Upload a GGUF model": "Subir un modelo GGUF",
|
||||
"Upload Files": "Subir archivos",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Progreso de carga",
|
||||
"URL Mode": "Modo de URL",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Utilice '#' en el prompt para cargar y seleccionar sus documentos.",
|
||||
@@ -517,6 +563,7 @@
|
||||
"Warning": "Advertencia",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Advertencia: Si actualiza o cambia su modelo de inserción, necesitará volver a importar todos los documentos.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web Loader Settings",
|
||||
"Web Params": "Web Params",
|
||||
"Web Search": "Búsqueda en la Web",
|
||||
@@ -527,18 +574,20 @@
|
||||
"WebUI will make requests to": "WebUI realizará solicitudes a",
|
||||
"What’s New in": "Novedades en",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Cuando el historial está desactivado, los nuevos chats en este navegador no aparecerán en el historial de ninguno de sus dispositivos..",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Espacio de trabajo",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Escribe una sugerencia para un prompt (por ejemplo, ¿quién eres?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Escribe un resumen en 50 palabras que resuma [tema o palabra clave].",
|
||||
"Yesterday": "Ayer",
|
||||
"You": "Usted",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "No se puede clonar un modelo base",
|
||||
"You have no archived conversations.": "No tiene conversaciones archivadas.",
|
||||
"You have shared this chat": "Usted ha compartido esta conversación",
|
||||
"You're a helpful assistant.": "Usted es un asistente útil.",
|
||||
"You're now logged in.": "Usted ahora está conectado.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Configuración del cargador de Youtube"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "یک کاربر",
|
||||
"About": "درباره",
|
||||
"Account": "حساب کاربری",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "اطلاعات دقیق",
|
||||
"Active Users": "",
|
||||
"Add": "اضافه کردن",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "اضافه کردن کاربر",
|
||||
"Adjusting these settings will apply changes universally to all users.": "با تنظیم این تنظیمات، تغییرات به طور کلی برای همه کاربران اعمال می شود.",
|
||||
"admin": "مدیر",
|
||||
"Admin": "",
|
||||
"Admin Panel": "پنل مدیریت",
|
||||
"Admin Settings": "تنظیمات مدیریت",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "پارامترهای پیشرفته",
|
||||
"Advanced Params": "پارام های پیشرفته",
|
||||
"all": "همه",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "صدا",
|
||||
"August": "آگوست",
|
||||
"Auto-playback response": "پخش خودکار پاسخ ",
|
||||
"Auto-send input after 3 sec.": "به طور خودکار ورودی را پس از 3 ثانیه ارسال کن.",
|
||||
"AUTOMATIC1111 Base URL": "پایه URL AUTOMATIC1111 ",
|
||||
"AUTOMATIC1111 Base URL is required.": "به URL پایه AUTOMATIC1111 مورد نیاز است.",
|
||||
"available!": "در دسترس!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "پاسخ خوب نیست",
|
||||
"Banners": "بنر",
|
||||
"Base Model (From)": "مدل پایه (از)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "قبل",
|
||||
"Being lazy": "حالت سازنده",
|
||||
"Brave Search API Key": "کلید API جستجوی شجاع",
|
||||
"Bypass SSL verification for Websites": "عبور از تأیید SSL برای وب سایت ها",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "لغو",
|
||||
"Capabilities": "قابلیت",
|
||||
"Change Password": "تغییر رمز عبور",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "پارامترهای تکه",
|
||||
"Chunk Size": "اندازه تکه",
|
||||
"Citation": "استناد",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "برای کمک اینجا را کلیک کنید.",
|
||||
"Click here to": "برای کمک اینجا را کلیک کنید.",
|
||||
"Click here to select": "برای انتخاب اینجا کلیک کنید",
|
||||
"Click here to select a csv file.": "برای انتخاب یک فایل csv اینجا را کلیک کنید.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "برای انتخاب اسناد اینجا را کلیک کنید.",
|
||||
"click here.": "اینجا کلیک کنید.",
|
||||
"Click on the user role button to change a user's role.": "برای تغییر نقش کاربر، روی دکمه نقش کاربر کلیک کنید.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "درخواست های همزمان",
|
||||
"Confirm Password": "تایید رمز عبور",
|
||||
"Connections": "ارتباطات",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "محتوا",
|
||||
"Context Length": "طول زمینه",
|
||||
"Continue Response": "ادامه پاسخ",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "حالت مکالمه",
|
||||
"Copied shared chat URL to clipboard!": "URL چت به کلیپ بورد کپی شد!",
|
||||
"Copy": "کپی",
|
||||
"Copy last code block": "کپی آخرین بلوک کد",
|
||||
"Copy last response": "کپی آخرین پاسخ",
|
||||
"Copy Link": "کپی لینک",
|
||||
"Copying to clipboard was successful!": "کپی کردن در کلیپ بورد با موفقیت انجام شد!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "یک عبارت مختصر و ۳ تا ۵ کلمه ای را به عنوان سرفصل برای پرس و جو زیر ایجاد کنید، به شدت محدودیت ۳-۵ کلمه را رعایت کنید و از استفاده از کلمه 'عنوان' خودداری کنید:",
|
||||
"Create a model": "ایجاد یک مدل",
|
||||
"Create Account": "ساخت حساب کاربری",
|
||||
"Create new key": "ساخت کلید جدید",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "دلخواه",
|
||||
"Customize models for a specific purpose": "سفارشی کردن مدل ها برای یک هدف خاص",
|
||||
"Dark": "تیره",
|
||||
"Dashboard": "",
|
||||
"Database": "پایگاه داده",
|
||||
"December": "دسامبر",
|
||||
"Default": "پیشفرض",
|
||||
"Default (Automatic1111)": "پیشفرض (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "پیشفرض (SentenceTransformers)",
|
||||
"Default (Web API)": "پیشفرض (Web API)",
|
||||
"Default Model": "مدل پیشفرض",
|
||||
"Default model updated": "مدل پیشفرض به\u200cروزرسانی شد",
|
||||
"Default Prompt Suggestions": "پیشنهادات پرامپت پیش فرض",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "یک اعلان را کشف کنید",
|
||||
"Discover, download, and explore custom prompts": "پرامپت\u200cهای سفارشی را کشف، دانلود و کاوش کنید",
|
||||
"Discover, download, and explore model presets": "پیش تنظیمات مدل را کشف، دانلود و کاوش کنید",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "نمایش نام کاربری به جای «شما» در چت",
|
||||
"Document": "سند",
|
||||
"Document Settings": "تنظیمات سند",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "به طور مثال '30s','10m'. واحد\u200cهای زمانی معتبر 's', 'm', 'h' هستند.",
|
||||
"Edit": "ویرایش",
|
||||
"Edit Doc": "ویرایش سند",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "ویرایش کاربر",
|
||||
"Email": "ایمیل",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "امتیاز را وارد کنید",
|
||||
"Enter Searxng Query URL": "نشانی وب پرسوجوی Searxng را وارد کنید",
|
||||
"Enter Serper API Key": "کلید API Serper را وارد کنید",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "کلید API Serpstack را وارد کنید",
|
||||
"Enter stop sequence": "توالی توقف را وارد کنید",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "مقدار Top K را وارد کنید",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "مقدار URL را وارد کنید (مثال http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "مقدار URL را وارد کنید (مثال http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "اکسپورت از نگاشت اسناد",
|
||||
"Export Models": "مدل های صادرات",
|
||||
"Export Prompts": "اکسپورت از پرامپت\u200cها",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "ایجاد کلید API با خطا مواجه شد.",
|
||||
"Failed to read clipboard contents": "خواندن محتوای کلیپ بورد ناموفق بود",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "مجازات فرکانس",
|
||||
"General": "عمومی",
|
||||
"General Settings": "تنظیمات عمومی",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "در حال تولید پرسوجوی جستجو",
|
||||
"Generation Info": "اطلاعات تولید",
|
||||
"Good Response": "پاسخ خوب",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "ایمپورت نگاشت اسناد",
|
||||
"Import Models": "واردات مدلها",
|
||||
"Import Prompts": "ایمپورت پرامپت\u200cها",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "فلگ `--api` را هنکام اجرای stable-diffusion-webui استفاده کنید.",
|
||||
"Info": "اطلاعات",
|
||||
"Input commands": "ورودی دستورات",
|
||||
"Install from Github URL": "نصب از ادرس Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "رابط",
|
||||
"Invalid Tag": "تگ نامعتبر",
|
||||
"January": "ژانویه",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT توکن",
|
||||
"Keep Alive": "Keep Alive",
|
||||
"Keyboard shortcuts": "میانبرهای صفحه کلید",
|
||||
"Knowledge": "",
|
||||
"Language": "زبان",
|
||||
"Last Active": "آخرین فعال",
|
||||
"Last Modified": "",
|
||||
"Light": "روشن",
|
||||
"Listening...": "در حال گوش دادن...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "مدل\u200cهای زبانی بزرگ می\u200cتوانند اشتباه کنند. اطلاعات مهم را راستی\u200cآزمایی کنید.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "ساخته شده توسط OpenWebUI Community",
|
||||
"Make sure to enclose them with": "مطمئن شوید که آنها را با این محصور کنید:",
|
||||
"Manage": "",
|
||||
"Manage Models": "مدیریت مدل\u200cها",
|
||||
"Manage Ollama Models": "مدیریت مدل\u200cهای اولاما",
|
||||
"Manage Pipelines": "مدیریت خطوط لوله",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "مدل '{{modelName}}' با موفقیت دانلود شد.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "مدل '{{modelTag}}' در حال حاضر در صف برای دانلود است.",
|
||||
"Model {{modelId}} not found": "مدل {{modelId}} یافت نشد",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "نام مدل خود را",
|
||||
"New Chat": "گپ جدید",
|
||||
"New Password": "رمز عبور جدید",
|
||||
"No documents found": "",
|
||||
"No results found": "نتیجه\u200cای یافت نشد",
|
||||
"No search query generated": "پرسوجوی جستجویی ایجاد نشده است",
|
||||
"No source available": "منبعی در دسترس نیست",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "API Ollama غیرفعال شد",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "نسخه اولاما",
|
||||
"On": "روشن",
|
||||
"Only": "فقط",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF سند (.pdf)",
|
||||
"PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)",
|
||||
"pending": "در انتظار",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "هنگام دسترسی به میکروفون، اجازه داده نشد: {{error}}",
|
||||
"Personalization": "شخصی سازی",
|
||||
"Pipelines": "خط لوله",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "خواندن به صورت صوتی",
|
||||
"Record voice": "ضبط صدا",
|
||||
"Redirecting you to OpenWebUI Community": "در حال هدایت به OpenWebUI Community",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "رد شده زمانی که باید نباشد",
|
||||
"Regenerate": "ری\u200cسازی",
|
||||
"Release Notes": "یادداشت\u200cهای انتشار",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "ذخیره",
|
||||
"Save & Create": "ذخیره و ایجاد",
|
||||
"Save & Update": "ذخیره و به\u200cروزرسانی",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "جستجوی اسناد",
|
||||
"Search Models": "مدل های جستجو",
|
||||
"Search Prompts": "جستجوی پرامپت\u200cها",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "تعداد نتایج جستجو",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "جستجو {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "جستجو {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "جستجو در وب برای '{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "نشانی وب جستجوی Searxng",
|
||||
"See readme.md for instructions": "برای مشاهده دستورالعمل\u200cها به readme.md مراجعه کنید",
|
||||
"See what's new": "ببینید موارد جدید چه بوده",
|
||||
"Seed": "Seed",
|
||||
"Select a base model": "انتخاب یک مدل پایه",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "یک حالت انتخاب کنید",
|
||||
"Select a model": "انتخاب یک مدل",
|
||||
"Select a pipeline": "انتخاب یک خط لوله",
|
||||
"Select a pipeline url": "یک ادرس خط لوله را انتخاب کنید",
|
||||
"Select an Ollama instance": "انتخاب یک نمونه از اولاما",
|
||||
"Select Documents": "",
|
||||
"Select model": "انتخاب یک مدل",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "مدل) های (انتخاب شده ورودیهای تصویر را پشتیبانی نمیکند",
|
||||
"Send": "ارسال",
|
||||
"Send a Message": "ارسال یک پیام",
|
||||
"Send message": "ارسال پیام",
|
||||
"September": "سپتامبر",
|
||||
"Serper API Key": "کلید API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "کلید API Serpstack",
|
||||
"Server connection verified": "اتصال سرور تأیید شد",
|
||||
"Set as default": "تنظیم به عنوان پیشفرض",
|
||||
"Set Default Model": "تنظیم مدل پیش فرض",
|
||||
"Set embedding model (e.g. {{model}})": "تنظیم مدل پیچشی (برای مثال {{model}})",
|
||||
"Set Image Size": "تنظیم اندازه تصویر",
|
||||
"Set Model": "تنظیم مدل",
|
||||
"Set reranking model (e.g. {{model}})": "تنظیم مدل ری\u200cراینگ (برای مثال {{model}})",
|
||||
"Set Steps": "تنظیم گام\u200cها",
|
||||
"Set Task Model": "تنظیم مدل تکلیف",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "منبع",
|
||||
"Speech recognition error: {{error}}": "خطای تشخیص گفتار: {{error}}",
|
||||
"Speech-to-Text Engine": "موتور گفتار به متن",
|
||||
"SpeechRecognition API is not supported in this browser.": "API تشخیص گفتار در این مرورگر پشتیبانی نمی شود.",
|
||||
"Stop Sequence": "توالی توقف",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT تنظیمات",
|
||||
"Submit": "ارسال",
|
||||
"Subtitle (e.g. about the Roman Empire)": "زیرنویس (برای مثال: درباره رمانی)",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "سیستم",
|
||||
"System Prompt": "پرامپت سیستم",
|
||||
"Tags": "تگ\u200cها",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "بیشتر بگویید:",
|
||||
"Temperature": "دما",
|
||||
"Template": "الگو",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "با تشکر از بازخورد شما!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "امتیاز باید یک مقدار بین 0.0 (0%) و 1.0 (100%) باشد.",
|
||||
"Theme": "قالب",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "این تضمین می کند که مکالمات ارزشمند شما به طور ایمن در پایگاه داده بکند ذخیره می شود. تشکر!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "این تنظیم در مرورگرها یا دستگاه\u200cها همگام\u200cسازی نمی\u200cشود.",
|
||||
"Thorough explanation": "توضیح کامل",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "با فشردن کلید Tab در ورودی چت پس از هر بار تعویض، چندین متغیر را به صورت متوالی به روزرسانی کنید.",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "به",
|
||||
"To access the available model names for downloading,": "برای دسترسی به نام مدل های موجود برای دانلود،",
|
||||
"To access the GGUF models available for downloading,": "برای دسترسی به مدل\u200cهای GGUF موجود برای دانلود،",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "در ورودی گپ.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "امروز",
|
||||
"Toggle settings": "نمایش/عدم نمایش تنظیمات",
|
||||
"Toggle sidebar": "نمایش/عدم نمایش نوار کناری",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "در دسترسی به اولاما مشکل دارید؟",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "تنظیمات TTS",
|
||||
"TTS Voice": "",
|
||||
"Type": "نوع",
|
||||
"Type Hugging Face Resolve (Download) URL": "مقدار URL دانلود (Resolve) Hugging Face را وارد کنید",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "اوه اوه! مشکلی در اتصال به {{provider}} وجود داشت.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "نوع فایل '{{file_type}}' ناشناخته است، به عنوان یک فایل متنی ساده با آن برخورد می شود.",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "به روزرسانی و کپی لینک",
|
||||
"Update password": "به روزرسانی رمزعبور",
|
||||
"Upload a GGUF model": "آپلود یک مدل GGUF",
|
||||
"Upload Files": "بارگذاری پروندهها",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "پیشرفت آپلود",
|
||||
"URL Mode": "حالت URL",
|
||||
"Use '#' in the prompt input to load and select your documents.": "در پرامپت از '#' برای لود و انتخاب اسناد خود استفاده کنید.",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "هشدار",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "هشدار: اگر شما به روز کنید یا تغییر دهید مدل شما، باید تمام سند ها را مجددا وارد کنید.",
|
||||
"Web": "وب",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "تنظیمات لودر وب",
|
||||
"Web Params": "پارامترهای وب",
|
||||
"Web Search": "جستجوی وب",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "WebUI درخواست\u200cها را ارسال خواهد کرد به",
|
||||
"What’s New in": "موارد جدید در",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "وقتی سابقه خاموش است، چت\u200cهای جدید در این مرورگر در سابقه شما در هیچ یک از دستگاه\u200cهایتان ظاهر نمی\u200cشوند.",
|
||||
"Whisper (Local)": "ویسپر (محلی)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "محیط کار",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "یک پیشنهاد پرامپت بنویسید (مثلاً شما کی هستید؟)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "خلاصه ای در 50 کلمه بنویسید که [موضوع یا کلمه کلیدی] را خلاصه کند.",
|
||||
"Yesterday": "دیروز",
|
||||
"You": "شما",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "شما نمیتوانید یک مدل پایه را کلون کنید",
|
||||
"You have no archived conversations.": "شما هیچ گفتگوی ذخیره شده ندارید.",
|
||||
"You have shared this chat": "شما این گفتگو را به اشتراک گذاشته اید",
|
||||
"You're a helpful assistant.": "تو یک دستیار سودمند هستی.",
|
||||
"You're now logged in.": "شما اکنون وارد شده\u200cاید.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "یوتیوب",
|
||||
"Youtube Loader Settings": "تنظیمات لودر یوتیوب"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "käyttäjä",
|
||||
"About": "Tietoja",
|
||||
"Account": "Tili",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Tarkkaa tietoa",
|
||||
"Active Users": "",
|
||||
"Add": "Lisää",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Lisää käyttäjä",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Näiden asetusten säätäminen vaikuttaa kaikkiin käyttäjiin.",
|
||||
"admin": "hallinta",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Hallintapaneeli",
|
||||
"Admin Settings": "Hallinta-asetukset",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Edistyneet parametrit",
|
||||
"Advanced Params": "Edistyneet parametrit",
|
||||
"all": "kaikki",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Ääni",
|
||||
"August": "elokuu",
|
||||
"Auto-playback response": "Soita vastaus automaattisesti",
|
||||
"Auto-send input after 3 sec.": "Lähetä syöte automaattisesti 3 sekunnin kuluttua",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111-perus-URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111-perus-URL vaaditaan.",
|
||||
"available!": "saatavilla!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Epäkelpo vastaus",
|
||||
"Banners": "Bannerit",
|
||||
"Base Model (From)": "Perusmalli (alkaen)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "ennen",
|
||||
"Being lazy": "Oli laiska",
|
||||
"Brave Search API Key": "Brave Search API -avain",
|
||||
"Bypass SSL verification for Websites": "Ohita SSL-varmennus verkkosivustoille",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Peruuta",
|
||||
"Capabilities": "Ominaisuuksia",
|
||||
"Change Password": "Vaihda salasana",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Osien parametrit",
|
||||
"Chunk Size": "Osien koko",
|
||||
"Citation": "Sitaatti",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Klikkaa tästä saadaksesi apua.",
|
||||
"Click here to": "Klikkaa tästä",
|
||||
"Click here to select": "Klikkaa tästä valitaksesi",
|
||||
"Click here to select a csv file.": "Klikkaa tästä valitaksesi CSV-tiedosto.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Klikkaa tästä valitaksesi asiakirjoja.",
|
||||
"click here.": "klikkaa tästä.",
|
||||
"Click on the user role button to change a user's role.": "Klikkaa käyttäjän roolipainiketta vaihtaaksesi käyttäjän roolia.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Samanaikaiset pyynnöt",
|
||||
"Confirm Password": "Vahvista salasana",
|
||||
"Connections": "Yhteydet",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Sisältö",
|
||||
"Context Length": "Kontekstin pituus",
|
||||
"Continue Response": "Jatka vastausta",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Keskustelutila",
|
||||
"Copied shared chat URL to clipboard!": "Jaettu keskustelulinkki kopioitu leikepöydälle!",
|
||||
"Copy": "Kopioi",
|
||||
"Copy last code block": "Kopioi viimeisin koodilohko",
|
||||
"Copy last response": "Kopioi viimeisin vastaus",
|
||||
"Copy Link": "Kopioi linkki",
|
||||
"Copying to clipboard was successful!": "Kopioiminen leikepöydälle onnistui!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Luo tiivis, 3-5 sanan lause otsikoksi seuraavalle kyselylle, noudattaen tiukasti 3-5 sanan rajoitusta ja välttäen sanan 'otsikko' käyttöä:",
|
||||
"Create a model": "Mallin luominen",
|
||||
"Create Account": "Luo tili",
|
||||
"Create new key": "Luo uusi avain",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Mukautettu",
|
||||
"Customize models for a specific purpose": "Mallien mukauttaminen tiettyyn tarkoitukseen",
|
||||
"Dark": "Tumma",
|
||||
"Dashboard": "",
|
||||
"Database": "Tietokanta",
|
||||
"December": "joulukuu",
|
||||
"Default": "Oletus",
|
||||
"Default (Automatic1111)": "Oletus (AUTOMATIC1111)",
|
||||
"Default (SentenceTransformers)": "Oletus (SentenceTransformers)",
|
||||
"Default (Web API)": "Oletus (web-API)",
|
||||
"Default Model": "Oletusmalli",
|
||||
"Default model updated": "Oletusmalli päivitetty",
|
||||
"Default Prompt Suggestions": "Oletuskehotteiden ehdotukset",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Löydä kehote",
|
||||
"Discover, download, and explore custom prompts": "Löydä ja lataa mukautettuja kehotteita",
|
||||
"Discover, download, and explore model presets": "Löydä ja lataa mallien esiasetuksia",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Näytä käyttäjänimi keskustelussa",
|
||||
"Document": "Asiakirja",
|
||||
"Document Settings": "Asiakirja-asetukset",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "esim. '30s', '10m'. Kelpoiset aikayksiköt ovat 's', 'm', 'h'.",
|
||||
"Edit": "Muokkaa",
|
||||
"Edit Doc": "Muokkaa asiakirjaa",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Muokkaa käyttäjää",
|
||||
"Email": "Sähköposti",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Syötä pisteet",
|
||||
"Enter Searxng Query URL": "Kirjoita Searxng-kyselyn URL-osoite",
|
||||
"Enter Serper API Key": "Anna Serper API -avain",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Anna Serpstack API -avain",
|
||||
"Enter stop sequence": "Syötä lopetussekvenssi",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Syötä Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Syötä URL (esim. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Syötä URL (esim. http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Vie asiakirjakartoitus",
|
||||
"Export Models": "Vie malleja",
|
||||
"Export Prompts": "Vie kehotteet",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API-avaimen luonti epäonnistui.",
|
||||
"Failed to read clipboard contents": "Leikepöydän sisällön lukeminen epäonnistui",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Taajuussakko",
|
||||
"General": "Yleinen",
|
||||
"General Settings": "Yleisasetukset",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Hakukyselyn luominen",
|
||||
"Generation Info": "Generointitiedot",
|
||||
"Good Response": "Hyvä vastaus",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Tuo asiakirjakartoitus",
|
||||
"Import Models": "Mallien tuominen",
|
||||
"Import Prompts": "Tuo kehotteita",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Sisällytä `--api`-parametri suorittaessasi stable-diffusion-webui",
|
||||
"Info": "Info",
|
||||
"Input commands": "Syötä komennot",
|
||||
"Install from Github URL": "Asenna Githubin URL-osoitteesta",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Käyttöliittymä",
|
||||
"Invalid Tag": "Virheellinen tagi",
|
||||
"January": "tammikuu",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT-token",
|
||||
"Keep Alive": "Pysy aktiivisena",
|
||||
"Keyboard shortcuts": "Pikanäppäimet",
|
||||
"Knowledge": "",
|
||||
"Language": "Kieli",
|
||||
"Last Active": "Viimeksi aktiivinen",
|
||||
"Last Modified": "",
|
||||
"Light": "Vaalea",
|
||||
"Listening...": "Kuunnellaan...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "Kielimallit voivat tehdä virheitä. Varmista tärkeät tiedot.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Tehnyt OpenWebUI-yhteisö",
|
||||
"Make sure to enclose them with": "Varmista, että suljet ne",
|
||||
"Manage": "",
|
||||
"Manage Models": "Hallitse malleja",
|
||||
"Manage Ollama Models": "Hallitse Ollama-malleja",
|
||||
"Manage Pipelines": "Hallitse putkia",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "DD MMMM YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "DD MMMM YYYY, HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Malli '{{modelName}}' ladattiin onnistuneesti.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Malli '{{modelTag}}' on jo jonossa ladattavaksi.",
|
||||
"Model {{modelId}} not found": "Mallia {{modelId}} ei löytynyt",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Mallin nimeäminen",
|
||||
"New Chat": "Uusi keskustelu",
|
||||
"New Password": "Uusi salasana",
|
||||
"No documents found": "",
|
||||
"No results found": "Ei tuloksia",
|
||||
"No search query generated": "Hakukyselyä ei luotu",
|
||||
"No source available": "Ei lähdettä saatavilla",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API poistettu käytöstä",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama-versio",
|
||||
"On": "Päällä",
|
||||
"Only": "Vain",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF-tiedosto (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
|
||||
"pending": "odottaa",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Mikrofonin käyttöoikeus evätty: {{error}}",
|
||||
"Personalization": "Henkilökohtaisuus",
|
||||
"Pipelines": "Putkistot",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Lue ääneen",
|
||||
"Record voice": "Nauhoita ääni",
|
||||
"Redirecting you to OpenWebUI Community": "Ohjataan sinut OpenWebUI-yhteisöön",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Kieltäytyi, vaikka ei olisi pitänyt",
|
||||
"Regenerate": "Uudelleenluo",
|
||||
"Release Notes": "Julkaisutiedot",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosee-mänty",
|
||||
"Rosé Pine Dawn": "Aamuinen Rosee-mänty",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Tallenna",
|
||||
"Save & Create": "Tallenna ja luo",
|
||||
"Save & Update": "Tallenna ja päivitä",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "Hae asiakirjoja",
|
||||
"Search Models": "Hae malleja",
|
||||
"Search Prompts": "Hae kehotteita",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Hakutulosten määrä",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Haettu {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Haku {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Haku verkosta hakusanalla {{searchQuery}}",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng-kyselyn URL-osoite",
|
||||
"See readme.md for instructions": "Katso lisää ohjeita readme.md:stä",
|
||||
"See what's new": "Katso, mitä uutta",
|
||||
"Seed": "Siemen",
|
||||
"Select a base model": "Valitse perusmalli",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Valitse tila",
|
||||
"Select a model": "Valitse malli",
|
||||
"Select a pipeline": "Valitse putki",
|
||||
"Select a pipeline url": "Valitse putken URL-osoite",
|
||||
"Select an Ollama instance": "Valitse Ollama-instanssi",
|
||||
"Select Documents": "",
|
||||
"Select model": "Valitse malli",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Valitut mallit eivät tue kuvasyötteitä",
|
||||
"Send": "Lähetä",
|
||||
"Send a Message": "Lähetä viesti",
|
||||
"Send message": "Lähetä viesti",
|
||||
"September": "syyskuu",
|
||||
"Serper API Key": "Serper API -avain",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API -avain",
|
||||
"Server connection verified": "Palvelinyhteys varmennettu",
|
||||
"Set as default": "Aseta oletukseksi",
|
||||
"Set Default Model": "Aseta oletusmalli",
|
||||
"Set embedding model (e.g. {{model}})": "Aseta upotusmalli (esim. {{model}})",
|
||||
"Set Image Size": "Aseta kuvan koko",
|
||||
"Set Model": "Aseta malli",
|
||||
"Set reranking model (e.g. {{model}})": "Aseta uudelleenpisteytysmalli (esim. {{model}})",
|
||||
"Set Steps": "Aseta askelmäärä",
|
||||
"Set Task Model": "Aseta tehtävämalli",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "Lähde",
|
||||
"Speech recognition error: {{error}}": "Puheentunnistusvirhe: {{error}}",
|
||||
"Speech-to-Text Engine": "Puheentunnistusmoottori",
|
||||
"SpeechRecognition API is not supported in this browser.": "SpeechRecognition-rajapinta ei ole tuettu tässä selaimessa.",
|
||||
"Stop Sequence": "Lopetussekvenssi",
|
||||
"STT Model": "",
|
||||
"STT Settings": "Puheentunnistusasetukset",
|
||||
"Submit": "Lähetä",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Alaotsikko (esim. Rooman valtakunnasta)",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "Järjestelmä",
|
||||
"System Prompt": "Järjestelmäkehote",
|
||||
"Tags": "Tagit",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Kerro lisää:",
|
||||
"Temperature": "Lämpötila",
|
||||
"Template": "Malline",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "Kiitos palautteestasi!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Pisteytyksen tulee olla arvo välillä 0.0 (0%) ja 1.0 (100%).",
|
||||
"Theme": "Teema",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Tämä varmistaa, että arvokkaat keskustelusi tallennetaan turvallisesti backend-tietokantaasi. Kiitos!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Tämä asetus ei synkronoidu selainten tai laitteiden välillä.",
|
||||
"Thorough explanation": "Perusteellinen selitys",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Vinkki: Päivitä useita muuttujapaikkoja peräkkäin painamalla tabulaattoria keskustelusyötteessä jokaisen korvauksen jälkeen.",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "->",
|
||||
"To access the available model names for downloading,": "Päästäksesi käsiksi ladattavissa oleviin mallinimiin,",
|
||||
"To access the GGUF models available for downloading,": "Päästäksesi käsiksi ladattavissa oleviin GGUF-malleihin,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "keskustelusyötteeseen.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Tänään",
|
||||
"Toggle settings": "Kytke asetukset",
|
||||
"Toggle sidebar": "Kytke sivupalkki",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Ongelmia Ollama-yhteydessä?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "Puheentuottamisasetukset",
|
||||
"TTS Voice": "",
|
||||
"Type": "Tyyppi",
|
||||
"Type Hugging Face Resolve (Download) URL": "Kirjoita Hugging Face -resolve-osoite",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Voi ei! Yhteysongelma {{provider}}:n kanssa.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tuntematon tiedostotyyppi '{{file_type}}', mutta hyväksytään ja käsitellään pelkkänä tekstinä",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Päivitä ja kopioi linkki",
|
||||
"Update password": "Päivitä salasana",
|
||||
"Upload a GGUF model": "Lataa GGUF-malli",
|
||||
"Upload Files": "Lataa tiedostoja",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Latauksen eteneminen",
|
||||
"URL Mode": "URL-tila",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Käytä '#' syötteessä ladataksesi ja valitaksesi asiakirjoja.",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "Varoitus",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Varoitus: Jos päivität tai vaihdat upotusmallia, sinun on tuotava kaikki asiakirjat uudelleen.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web Loader asetukset",
|
||||
"Web Params": "Web-parametrit",
|
||||
"Web Search": "Web-haku",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "WebUI tekee pyyntöjä",
|
||||
"What’s New in": "Mitä uutta",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kun historia on pois päältä, uudet keskustelut tässä selaimessa eivät näy historiassasi millään laitteellasi.",
|
||||
"Whisper (Local)": "Whisper (paikallinen)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Työtilat",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Kirjoita ehdotettu kehote (esim. Kuka olet?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Kirjoita 50 sanan yhteenveto, joka tiivistää [aihe tai avainsana].",
|
||||
"Yesterday": "Eilen",
|
||||
"You": "Sinä",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "Perusmallia ei voi kloonata",
|
||||
"You have no archived conversations.": "Sinulla ei ole arkistoituja keskusteluja.",
|
||||
"You have shared this chat": "Olet jakanut tämän keskustelun",
|
||||
"You're a helpful assistant.": "Olet avulias apulainen.",
|
||||
"You're now logged in.": "Olet nyt kirjautunut sisään.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube Loader-asetukset"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "un utilisateur",
|
||||
"About": "À propos",
|
||||
"Account": "Compte",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Information précise",
|
||||
"Active Users": "",
|
||||
"Add": "Ajouter",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Ajouter un utilisateur",
|
||||
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.",
|
||||
"admin": "Administrateur",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Panneau d'administration",
|
||||
"Admin Settings": "Paramètres d'administration",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Paramètres avancés",
|
||||
"Advanced Params": "Params avancés",
|
||||
"all": "tous",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Audio",
|
||||
"August": "Août",
|
||||
"Auto-playback response": "Réponse en lecture automatique",
|
||||
"Auto-send input after 3 sec.": "Envoyer automatiquement l'entrée après 3 sec.",
|
||||
"AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.",
|
||||
"available!": "disponible !",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Mauvaise réponse",
|
||||
"Banners": "Bannières",
|
||||
"Base Model (From)": "Modèle de base (à partir de)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "avant",
|
||||
"Being lazy": "En manque de temps",
|
||||
"Brave Search API Key": "Clé d’API de recherche brave",
|
||||
"Bypass SSL verification for Websites": "Parcourir la vérification SSL pour les sites Web",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Annuler",
|
||||
"Capabilities": "Capacités",
|
||||
"Change Password": "Changer le mot de passe",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Paramètres de bloc",
|
||||
"Chunk Size": "Taille de bloc",
|
||||
"Citation": "Citations",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Cliquez ici pour de l'aide.",
|
||||
"Click here to": "Cliquez ici pour",
|
||||
"Click here to select": "Cliquez ici pour sélectionner",
|
||||
"Click here to select a csv file.": "Cliquez ici pour sélectionner un fichier csv.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Cliquez ici pour sélectionner des documents.",
|
||||
"click here.": "cliquez ici.",
|
||||
"Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour changer le rôle d'un utilisateur.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Demandes simultanées",
|
||||
"Confirm Password": "Confirmer le mot de passe",
|
||||
"Connections": "Connexions",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Contenu",
|
||||
"Context Length": "Longueur du contexte",
|
||||
"Continue Response": "Continuer la réponse",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Mode de conversation",
|
||||
"Copied shared chat URL to clipboard!": "URL de chat partagé copié dans le presse-papier !",
|
||||
"Copy": "Copier",
|
||||
"Copy last code block": "Copier le dernier bloc de code",
|
||||
"Copy last response": "Copier la dernière réponse",
|
||||
"Copy Link": "Copier le lien",
|
||||
"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3 à 5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3 à 5 mots et en évitant l'utilisation du mot 'titre' :",
|
||||
"Create a model": "Créer un modèle",
|
||||
"Create Account": "Créer un compte",
|
||||
"Create new key": "Créer une nouvelle clé",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Personnalisé",
|
||||
"Customize models for a specific purpose": "Personnaliser les modèles dans un but spécifique",
|
||||
"Dark": "Sombre",
|
||||
"Dashboard": "",
|
||||
"Database": "Base de données",
|
||||
"December": "Décembre",
|
||||
"Default": "Par défaut",
|
||||
"Default (Automatic1111)": "Par défaut (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Par défaut (SentenceTransformers)",
|
||||
"Default (Web API)": "Par défaut (API Web)",
|
||||
"Default Model": "Modèle par défaut",
|
||||
"Default model updated": "Modèle par défaut mis à jour",
|
||||
"Default Prompt Suggestions": "Suggestions de prompt par défaut",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Découvrir un prompt",
|
||||
"Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés",
|
||||
"Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Afficher le nom d'utilisateur au lieu de 'Vous' dans la Discussion",
|
||||
"Document": "Document",
|
||||
"Document Settings": "Paramètres du document",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ex. '30s', '10m'. Les unités de temps valides sont 's', 'm', 'h'.",
|
||||
"Edit": "Éditer",
|
||||
"Edit Doc": "Éditer le document",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Éditer l'utilisateur",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Entrez le score",
|
||||
"Enter Searxng Query URL": "Entrez l’URL de requête Searxng",
|
||||
"Enter Serper API Key": "Entrez la clé API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Entrez dans la clé API Serpstack",
|
||||
"Enter stop sequence": "Entrez la séquence de fin",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Entrez Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (p. ex. http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Exporter le mappage des documents",
|
||||
"Export Models": "Modèles d’exportation",
|
||||
"Export Prompts": "Exporter les prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Impossible de créer la clé API.",
|
||||
"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Pénalité de fréquence",
|
||||
"General": "Général",
|
||||
"General Settings": "Paramètres généraux",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Génération d’une requête de recherche",
|
||||
"Generation Info": "Informations de génération",
|
||||
"Good Response": "Bonne réponse",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Importer le mappage des documents",
|
||||
"Import Models": "Importer des modèles",
|
||||
"Import Prompts": "Importer les prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inclure l'indicateur `--api` lors de l'exécution de stable-diffusion-webui",
|
||||
"Info": "L’info",
|
||||
"Input commands": "Entrez des commandes d'entrée",
|
||||
"Install from Github URL": "Installer à partir de l’URL Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Interface",
|
||||
"Invalid Tag": "Tag invalide",
|
||||
"January": "Janvier",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "Jeton JWT",
|
||||
"Keep Alive": "Garder actif",
|
||||
"Keyboard shortcuts": "Raccourcis clavier",
|
||||
"Knowledge": "",
|
||||
"Language": "Langue",
|
||||
"Last Active": "Dernière activité",
|
||||
"Last Modified": "",
|
||||
"Light": "Lumière",
|
||||
"Listening...": "Écoute...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
|
||||
"Make sure to enclose them with": "Assurez-vous de les entourer avec",
|
||||
"Manage": "",
|
||||
"Manage Models": "Gérer les modèles",
|
||||
"Manage Ollama Models": "Gérer les modèles Ollama",
|
||||
"Manage Pipelines": "Gérer les pipelines",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.",
|
||||
"Model {{modelId}} not found": "Modèle {{modelId}} non trouvé",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Nommez votre modèle",
|
||||
"New Chat": "Nouvelle discussion",
|
||||
"New Password": "Nouveau mot de passe",
|
||||
"No documents found": "",
|
||||
"No results found": "Aucun résultat trouvé",
|
||||
"No search query generated": "Aucune requête de recherche générée",
|
||||
"No source available": "Aucune source disponible",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "API Ollama désactivée",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Version Ollama",
|
||||
"On": "Activé",
|
||||
"Only": "Seulement",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "Document PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
|
||||
"pending": "en attente",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
|
||||
"Personalization": "Personnalisation",
|
||||
"Pipelines": "Pipelines",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Lire à l'échelle",
|
||||
"Record voice": "Enregistrer la voix",
|
||||
"Redirecting you to OpenWebUI Community": "Vous redirige vers la communauté OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Refusé quand il ne devrait pas l'être",
|
||||
"Regenerate": "Régénérer",
|
||||
"Release Notes": "Notes de version",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Pin Rosé",
|
||||
"Rosé Pine Dawn": "Aube Pin Rosé",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Enregistrer",
|
||||
"Save & Create": "Enregistrer & Créer",
|
||||
"Save & Update": "Enregistrer & Mettre à jour",
|
||||
@@ -399,35 +427,41 @@
|
||||
"Search Documents": "Rechercher des documents",
|
||||
"Search Models": "Modèles de recherche",
|
||||
"Search Prompts": "Rechercher des prompts",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Nombre de résultats de la recherche",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Recherche dans {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Recherche dans {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Recherche dans {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Recherche sur le Web pour '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL de la requête Searxng",
|
||||
"See readme.md for instructions": "Voir readme.md pour les instructions",
|
||||
"See what's new": "Voir les nouveautés",
|
||||
"Seed": "Graine",
|
||||
"Select a base model": "Sélectionner un modèle de base",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Sélectionnez un mode",
|
||||
"Select a model": "Sélectionnez un modèle",
|
||||
"Select a pipeline": "Sélectionner un pipeline",
|
||||
"Select a pipeline url": "Sélectionnez une URL de pipeline",
|
||||
"Select an Ollama instance": "Sélectionner une instance Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Sélectionnez un modèle",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Les modèles sélectionnés ne prennent pas en charge les entrées d’image",
|
||||
"Send": "Envoyer",
|
||||
"Send a Message": "Envoyer un message",
|
||||
"Send message": "Envoyer un message",
|
||||
"September": "Septembre",
|
||||
"Serper API Key": "Clé API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Clé API Serpstack",
|
||||
"Server connection verified": "Connexion au serveur vérifiée",
|
||||
"Set as default": "Définir par défaut",
|
||||
"Set Default Model": "Définir le modèle par défaut",
|
||||
"Set embedding model (e.g. {{model}})": "Définir le modèle d'embedding (par exemple {{model}})",
|
||||
"Set Image Size": "Définir la taille de l'image",
|
||||
"Set Model": "Configurer le modèle",
|
||||
"Set reranking model (e.g. {{model}})": "Définir le modèle de reranking (par exemple {{model}})",
|
||||
"Set Steps": "Définir les étapes",
|
||||
"Set Task Model": "Définir le modèle de tâche",
|
||||
@@ -451,8 +485,8 @@
|
||||
"Source": "Source",
|
||||
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
|
||||
"Speech-to-Text Engine": "Moteur reconnaissance vocale",
|
||||
"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
|
||||
"Stop Sequence": "Séquence d'arrêt",
|
||||
"STT Model": "",
|
||||
"STT Settings": "Paramètres de STT",
|
||||
"Submit": "Soumettre",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Sous-titre (par exemple, sur l'empire romain)",
|
||||
@@ -462,6 +496,7 @@
|
||||
"System": "Système",
|
||||
"System Prompt": "Prompt Système",
|
||||
"Tags": "Tags",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Donnez-nous plus:",
|
||||
"Temperature": "Température",
|
||||
"Template": "Modèle",
|
||||
@@ -471,7 +506,9 @@
|
||||
"Thanks for your feedback!": "Merci pour votre feedback!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score doit être une valeur entre 0.0 (0%) et 1.0 (100%).",
|
||||
"Theme": "Thème",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont enregistrées en toute sécurité dans votre base de données backend. Merci !",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Ce réglage ne se synchronise pas entre les navigateurs ou les appareils.",
|
||||
"Thorough explanation": "Explication approfondie",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Astuce : Mettez à jour plusieurs emplacements de variables consécutivement en appuyant sur la touche tabulation dans l'entrée de chat après chaque remplacement.",
|
||||
@@ -483,22 +520,31 @@
|
||||
"to": "à",
|
||||
"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
|
||||
"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "à l'entrée du chat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Aujourd'hui",
|
||||
"Toggle settings": "Basculer les paramètres",
|
||||
"Toggle sidebar": "Basculer la barre latérale",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Des problèmes pour accéder à Ollama ?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "Paramètres TTS",
|
||||
"TTS Voice": "",
|
||||
"Type": "Type",
|
||||
"Type Hugging Face Resolve (Download) URL": "Entrez l'URL de résolution (téléchargement) Hugging Face",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de fichier inconnu '{{file_type}}', mais accepté et traité comme du texte brut",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Mettre à jour et copier le lien",
|
||||
"Update password": "Mettre à jour le mot de passe",
|
||||
"Upload a GGUF model": "Téléverser un modèle GGUF",
|
||||
"Upload Files": "Télécharger des fichiers",
|
||||
"Upload Files": "Téléverser des fichiers",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Progression du Téléversement",
|
||||
"URL Mode": "Mode URL",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée de prompt pour charger et sélectionner vos documents.",
|
||||
@@ -517,6 +563,7 @@
|
||||
"Warning": "Avertissement",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Attention : Si vous mettez à jour ou changez votre modèle d'intégration, vous devrez réimporter tous les documents.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Paramètres du chargeur Web",
|
||||
"Web Params": "Paramètres Web",
|
||||
"Web Search": "Recherche sur le Web",
|
||||
@@ -527,18 +574,20 @@
|
||||
"WebUI will make requests to": "WebUI effectuera des demandes à",
|
||||
"What’s New in": "Quoi de neuf dans",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouvelles discussions sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Espace de travail",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Rédigez une suggestion de prompt (p. ex. Qui êtes-vous ?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Rédigez un résumé en 50 mots qui résume [sujet ou mot-clé].",
|
||||
"Yesterday": "hier",
|
||||
"You": "Vous",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "Vous ne pouvez pas cloner un modèle de base",
|
||||
"You have no archived conversations.": "Vous n'avez aucune conversation archivée.",
|
||||
"You have shared this chat": "Vous avez partagé cette conversation",
|
||||
"You're a helpful assistant.": "Vous êtes un assistant utile",
|
||||
"You're now logged in.": "Vous êtes maintenant connecté.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Paramètres du chargeur Youtube"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "un utilisateur",
|
||||
"About": "À Propos",
|
||||
"Account": "Compte",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Information précise",
|
||||
"Active Users": "",
|
||||
"Add": "Ajouter",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Ajouter un Utilisateur",
|
||||
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera les changements à tous les utilisateurs.",
|
||||
"admin": "admin",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Panneau d'Administration",
|
||||
"Admin Settings": "Paramètres d'Administration",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Paramètres Avancés",
|
||||
"Advanced Params": "Params Avancés",
|
||||
"all": "tous",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Audio",
|
||||
"August": "Août",
|
||||
"Auto-playback response": "Réponse en lecture automatique",
|
||||
"Auto-send input after 3 sec.": "Envoyer automatiquement l'entrée après 3 sec.",
|
||||
"AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "L'URL de base AUTOMATIC1111 est requise.",
|
||||
"available!": "disponible !",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Mauvaise Réponse",
|
||||
"Banners": "Bannières",
|
||||
"Base Model (From)": "Modèle de Base (De)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "avant",
|
||||
"Being lazy": "Est paresseux",
|
||||
"Brave Search API Key": "Clé API Brave Search",
|
||||
"Bypass SSL verification for Websites": "Contourner la vérification SSL pour les sites Web.",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Annuler",
|
||||
"Capabilities": "Capacités",
|
||||
"Change Password": "Changer le mot de passe",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Paramètres de bloc",
|
||||
"Chunk Size": "Taille de bloc",
|
||||
"Citation": "Citation",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Cliquez ici pour de l'aide.",
|
||||
"Click here to": "Cliquez ici pour",
|
||||
"Click here to select": "Cliquez ici pour sélectionner",
|
||||
"Click here to select a csv file.": "Cliquez ici pour sélectionner un fichier csv.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Cliquez ici pour sélectionner des documents.",
|
||||
"click here.": "cliquez ici.",
|
||||
"Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour changer le rôle d'un utilisateur.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Demandes simultanées",
|
||||
"Confirm Password": "Confirmer le mot de passe",
|
||||
"Connections": "Connexions",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Contenu",
|
||||
"Context Length": "Longueur du contexte",
|
||||
"Continue Response": "Continuer la Réponse",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Mode de conversation",
|
||||
"Copied shared chat URL to clipboard!": "URL du chat copié dans le presse-papiers !",
|
||||
"Copy": "Copier",
|
||||
"Copy last code block": "Copier le dernier bloc de code",
|
||||
"Copy last response": "Copier la dernière réponse",
|
||||
"Copy Link": "Copier le Lien",
|
||||
"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :",
|
||||
"Create a model": "Créer un modèle",
|
||||
"Create Account": "Créer un compte",
|
||||
"Create new key": "Créer une nouvelle clé",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Personnalisé",
|
||||
"Customize models for a specific purpose": "Personnaliser les modèles pour un objectif spécifique",
|
||||
"Dark": "Sombre",
|
||||
"Dashboard": "",
|
||||
"Database": "Base de données",
|
||||
"December": "Décembre",
|
||||
"Default": "Par défaut",
|
||||
"Default (Automatic1111)": "Par défaut (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Par défaut (SentenceTransformers)",
|
||||
"Default (Web API)": "Par défaut (API Web)",
|
||||
"Default Model": "Modèle par défaut",
|
||||
"Default model updated": "Modèle par défaut mis à jour",
|
||||
"Default Prompt Suggestions": "Suggestions de prompt par défaut",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Découvrir un prompt",
|
||||
"Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés",
|
||||
"Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Afficher le nom d'utilisateur au lieu de 'Vous' dans le Chat",
|
||||
"Document": "Document",
|
||||
"Document Settings": "Paramètres du document",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "par ex. '30s', '10m'. Les unités de temps valides sont 's', 'm', 'h'.",
|
||||
"Edit": "Éditer",
|
||||
"Edit Doc": "Éditer le document",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Éditer l'utilisateur",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Entrez le Score",
|
||||
"Enter Searxng Query URL": "Entrez l’URL de la requête Searxng",
|
||||
"Enter Serper API Key": "Entrez la clé API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Entrez la clé API Serpstack",
|
||||
"Enter stop sequence": "Entrez la séquence de fin",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Entrez Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (p. ex. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (p. ex. http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Exporter la Correspondance des Documents",
|
||||
"Export Models": "Exporter les Modèles",
|
||||
"Export Prompts": "Exporter les Prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Échec de la création de la clé d'API.",
|
||||
"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Pénalité de fréquence",
|
||||
"General": "Général",
|
||||
"General Settings": "Paramètres Généraux",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Génération d’une requête de recherche",
|
||||
"Generation Info": "Informations de la Génération",
|
||||
"Good Response": "Bonne Réponse",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Importer la Correspondance des Documents",
|
||||
"Import Models": "Importer des Modèles",
|
||||
"Import Prompts": "Importer des Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui",
|
||||
"Info": "Info",
|
||||
"Input commands": "Entrez les commandes d'entrée",
|
||||
"Install from Github URL": "Installer à partir de l’URL Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Interface",
|
||||
"Invalid Tag": "Tag Invalide",
|
||||
"January": "Janvier",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "Jeton JWT",
|
||||
"Keep Alive": "Rester en vie",
|
||||
"Keyboard shortcuts": "Raccourcis clavier",
|
||||
"Knowledge": "",
|
||||
"Language": "Langue",
|
||||
"Last Active": "Dernier Activité",
|
||||
"Last Modified": "",
|
||||
"Light": "Clair",
|
||||
"Listening...": "Écoute...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
|
||||
"Make sure to enclose them with": "Assurez-vous de les entourer avec",
|
||||
"Manage": "",
|
||||
"Manage Models": "Gérer les modèles",
|
||||
"Manage Ollama Models": "Gérer les modèles Ollama",
|
||||
"Manage Pipelines": "Gérer les pipelines",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.",
|
||||
"Model {{modelId}} not found": "Modèle {{modelId}} non trouvé",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Nommez votre modèle",
|
||||
"New Chat": "Nouveau chat",
|
||||
"New Password": "Nouveau mot de passe",
|
||||
"No documents found": "",
|
||||
"No results found": "Aucun résultat",
|
||||
"No search query generated": "Aucune requête de recherche générée",
|
||||
"No source available": "Aucune source disponible",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "API Ollama",
|
||||
"Ollama API disabled": "API Ollama désactivée",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Version Ollama",
|
||||
"On": "Activé",
|
||||
"Only": "Seulement",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "Document PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
|
||||
"pending": "en attente",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
|
||||
"Personalization": "Personnalisation",
|
||||
"Pipelines": "Pipelines",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Lire à Voix Haute",
|
||||
"Record voice": "Enregistrer la voix",
|
||||
"Redirecting you to OpenWebUI Community": "Redirection vers la communauté OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Refuse quand il ne devrait pas",
|
||||
"Regenerate": "Regénérer",
|
||||
"Release Notes": "Notes de Version",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Pin Rosé",
|
||||
"Rosé Pine Dawn": "Aube Pin Rosé",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Enregistrer",
|
||||
"Save & Create": "Enregistrer & Créer",
|
||||
"Save & Update": "Enregistrer & Mettre à jour",
|
||||
@@ -399,35 +427,41 @@
|
||||
"Search Documents": "Rechercher des Documents",
|
||||
"Search Models": "Rechercher des modèles",
|
||||
"Search Prompts": "Rechercher des Prompts",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Nombre de résultats de recherche",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Recherché {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Recherché {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Recherché {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Recherche sur le web pour '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL de requête Searxng",
|
||||
"See readme.md for instructions": "Voir readme.md pour les instructions",
|
||||
"See what's new": "Voir les nouveautés",
|
||||
"Seed": "Graine",
|
||||
"Select a base model": "Sélectionner un modèle de base",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Sélectionner un mode",
|
||||
"Select a model": "Sélectionner un modèle",
|
||||
"Select a pipeline": "Sélectionner un pipeline",
|
||||
"Select a pipeline url": "Sélectionnez une URL de pipeline",
|
||||
"Select an Ollama instance": "Sélectionner une instance Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Sélectionner un modèle",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Modèle(s) séléctionés ne supportent pas les entrées images",
|
||||
"Send": "Envoyer",
|
||||
"Send a Message": "Envoyer un message",
|
||||
"Send message": "Envoyer un message",
|
||||
"September": "Septembre",
|
||||
"Serper API Key": "Clé API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Clé API Serpstack",
|
||||
"Server connection verified": "Connexion au serveur vérifiée",
|
||||
"Set as default": "Définir par défaut",
|
||||
"Set Default Model": "Définir le Modèle par Défaut",
|
||||
"Set embedding model (e.g. {{model}})": "Définir le modèle d'embedding (p. ex. {{model}})",
|
||||
"Set Image Size": "Définir la Taille de l'Image",
|
||||
"Set Model": "Définir le Modèle",
|
||||
"Set reranking model (e.g. {{model}})": "Définir le modèle de reclassement (p. ex. {{model}})",
|
||||
"Set Steps": "Définir les Étapes",
|
||||
"Set Task Model": "Définir le modèle de tâche",
|
||||
@@ -451,8 +485,8 @@
|
||||
"Source": "Source",
|
||||
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
|
||||
"Speech-to-Text Engine": "Moteur de Reconnaissance Vocale",
|
||||
"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
|
||||
"Stop Sequence": "Séquence d'Arrêt",
|
||||
"STT Model": "",
|
||||
"STT Settings": "Paramètres STT",
|
||||
"Submit": "Envoyer",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Sous-Titres (p. ex. à propos de l'Empire Romain)",
|
||||
@@ -462,6 +496,7 @@
|
||||
"System": "Système",
|
||||
"System Prompt": "Prompt du Système",
|
||||
"Tags": "Tags",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Dites-nous en plus :",
|
||||
"Temperature": "Température",
|
||||
"Template": "Modèle",
|
||||
@@ -471,7 +506,9 @@
|
||||
"Thanks for your feedback!": "Merci pour votre avis !",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score devrait avoir une valeur entre 0.0 (0%) et 1.0 (100%).",
|
||||
"Theme": "Thème",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Cela garantit que vos précieuses conversations sont en sécurité dans votre base de données. Merci !",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Ce paramètre ne se synchronise pas entre les navigateurs ou les appareils.",
|
||||
"Thorough explanation": "Explication détaillée",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Conseil : Mettez à jour plusieurs emplacements de variables consécutivement en appuyant sur la touche tab dans l'entrée de chat après chaque remplacement",
|
||||
@@ -483,22 +520,31 @@
|
||||
"to": "à",
|
||||
"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
|
||||
"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "à l'entrée du chat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Aujourd'hui",
|
||||
"Toggle settings": "Basculer les paramètres",
|
||||
"Toggle sidebar": "Basculer la barre latérale",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "Paramètres TTS",
|
||||
"TTS Voice": "",
|
||||
"Type": "Type",
|
||||
"Type Hugging Face Resolve (Download) URL": "Entrez l'URL de Résolution (Téléchargement) Hugging Face",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh ! Il y a eu un problème de connexion à {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Type de Fichier Inconnu '{{file_type}}', mais accepté et traité comme du texte brut",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Mettre à Jour et Copier le Lien",
|
||||
"Update password": "Mettre à Jour le Mot de Passe",
|
||||
"Upload a GGUF model": "Téléverser un modèle GGUF",
|
||||
"Upload Files": "Télécharger des fichiers",
|
||||
"Upload Files": "Téléverser des fichiers",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Progression du Téléversement",
|
||||
"URL Mode": "Mode URL",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée du prompt pour charger et sélectionner vos documents.",
|
||||
@@ -517,6 +563,7 @@
|
||||
"Warning": "Avertissement",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifier votre modèle d'embedding, vous devrez réimporter tous les documents.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Paramètres du Chargeur Web",
|
||||
"Web Params": "Paramètres Web",
|
||||
"Web Search": "Recherche sur le Web",
|
||||
@@ -527,18 +574,20 @@
|
||||
"WebUI will make requests to": "WebUI effectuera des demandes à",
|
||||
"What’s New in": "Quoi de neuf dans",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Lorsque l'historique est désactivé, les nouveaux chats sur ce navigateur n'apparaîtront pas dans votre historique sur aucun de vos appareils.",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Espace de Travail",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Écrivez une suggestion de prompt (e.x. Qui est-tu ?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Ecrivez un résumé en 50 mots qui résume [sujet ou mot-clé]",
|
||||
"Yesterday": "Hier",
|
||||
"You": "Vous",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "Vous ne pouvez pas cloner un modèle de base",
|
||||
"You have no archived conversations.": "Vous n'avez pas de conversations archivées",
|
||||
"You have shared this chat": "Vous avez partagé ce chat",
|
||||
"You're a helpful assistant.": "Vous êtes un assistant utile.",
|
||||
"You're now logged in.": "Vous êtes maintenant connecté.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Paramètres du Chargeur YouTube"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "משתמש",
|
||||
"About": "אודות",
|
||||
"Account": "חשבון",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "מידע מדויק",
|
||||
"Active Users": "",
|
||||
"Add": "הוסף",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "הוסף משתמש",
|
||||
"Adjusting these settings will apply changes universally to all users.": "התאמת הגדרות אלו תחול על כל המשתמשים.",
|
||||
"admin": "מנהל",
|
||||
"Admin": "",
|
||||
"Admin Panel": "לוח בקרה למנהל",
|
||||
"Admin Settings": "הגדרות מנהל",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "פרמטרים מתקדמים",
|
||||
"Advanced Params": "פרמטרים מתקדמים",
|
||||
"all": "הכל",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "אודיו",
|
||||
"August": "אוגוסט",
|
||||
"Auto-playback response": "תגובת השמעה אוטומטית",
|
||||
"Auto-send input after 3 sec.": "שליחת קלט אוטומטית אחרי 3 שניות",
|
||||
"AUTOMATIC1111 Base URL": "כתובת URL בסיסית של AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "נדרשת כתובת URL בסיסית של AUTOMATIC1111",
|
||||
"available!": "זמין!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "תגובה שגויה",
|
||||
"Banners": "באנרים",
|
||||
"Base Model (From)": "דגם בסיס (מ)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "לפני",
|
||||
"Being lazy": "להיות עצלן",
|
||||
"Brave Search API Key": "מפתח API של חיפוש אמיץ",
|
||||
"Bypass SSL verification for Websites": "עקוף אימות SSL עבור אתרים",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "בטל",
|
||||
"Capabilities": "יכולות",
|
||||
"Change Password": "שנה סיסמה",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "פרמטרי נתונים",
|
||||
"Chunk Size": "גודל נתונים",
|
||||
"Citation": "ציטוט",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "לחץ כאן לעזרה.",
|
||||
"Click here to": "לחץ כאן כדי",
|
||||
"Click here to select": "לחץ כאן לבחירה",
|
||||
"Click here to select a csv file.": "לחץ כאן לבחירת קובץ csv.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "לחץ כאן לבחירת מסמכים.",
|
||||
"click here.": "לחץ כאן.",
|
||||
"Click on the user role button to change a user's role.": "לחץ על כפתור תפקיד המשתמש כדי לשנות את תפקיד המשתמש.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "בקשות בו-זמניות",
|
||||
"Confirm Password": "אשר סיסמה",
|
||||
"Connections": "חיבורים",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "תוכן",
|
||||
"Context Length": "אורך הקשר",
|
||||
"Continue Response": "המשך תגובה",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "מצב שיחה",
|
||||
"Copied shared chat URL to clipboard!": "העתקת כתובת URL של צ'אט משותף ללוח!",
|
||||
"Copy": "העתק",
|
||||
"Copy last code block": "העתק את בלוק הקוד האחרון",
|
||||
"Copy last response": "העתק את התגובה האחרונה",
|
||||
"Copy Link": "העתק קישור",
|
||||
"Copying to clipboard was successful!": "ההעתקה ללוח הייתה מוצלחת!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "צור ביטוי תמציתי של 3-5 מילים ככותרת לשאילתה הבאה, תוך שמירה מדויקת על מגבלת 3-5 המילים והימנעות משימוש במילה 'כותרת':",
|
||||
"Create a model": "יצירת מודל",
|
||||
"Create Account": "צור חשבון",
|
||||
"Create new key": "צור מפתח חדש",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "מותאם אישית",
|
||||
"Customize models for a specific purpose": "התאמה אישית של מודלים למטרה ספציפית",
|
||||
"Dark": "כהה",
|
||||
"Dashboard": "",
|
||||
"Database": "מסד נתונים",
|
||||
"December": "דצמבר",
|
||||
"Default": "ברירת מחדל",
|
||||
"Default (Automatic1111)": "ברירת מחדל (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "ברירת מחדל (SentenceTransformers)",
|
||||
"Default (Web API)": "ברירת מחדל (Web API)",
|
||||
"Default Model": "מודל ברירת מחדל",
|
||||
"Default model updated": "המודל המוגדר כברירת מחדל עודכן",
|
||||
"Default Prompt Suggestions": "הצעות ברירת מחדל לפקודות",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "גלה פקודה",
|
||||
"Discover, download, and explore custom prompts": "גלה, הורד, וחקור פקודות מותאמות אישית",
|
||||
"Discover, download, and explore model presets": "גלה, הורד, וחקור הגדרות מודל מוגדרות מראש",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "הצג את שם המשתמש במקום 'אתה' בצ'אט",
|
||||
"Document": "מסמך",
|
||||
"Document Settings": "הגדרות מסמך",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "למשל '30s', '10m'. יחידות זמן חוקיות הן 's', 'm', 'h'.",
|
||||
"Edit": "ערוך",
|
||||
"Edit Doc": "ערוך מסמך",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "ערוך משתמש",
|
||||
"Email": "דוא\"ל",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "הזן ציון",
|
||||
"Enter Searxng Query URL": "הזן כתובת URL של שאילתת Searxng",
|
||||
"Enter Serper API Key": "הזן מפתח API של Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "הזן מפתח API של Serpstack",
|
||||
"Enter stop sequence": "הזן רצף עצירה",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "הזן Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "הזן כתובת URL (למשל http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "הזן כתובת URL (למשל http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "ייצוא מיפוי מסמכים",
|
||||
"Export Models": "ייצוא מודלים",
|
||||
"Export Prompts": "ייצוא פקודות",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "יצירת מפתח API נכשלה.",
|
||||
"Failed to read clipboard contents": "קריאת תוכן הלוח נכשלה",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "עונש תדירות",
|
||||
"General": "כללי",
|
||||
"General Settings": "הגדרות כלליות",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "יצירת שאילתת חיפוש",
|
||||
"Generation Info": "מידע על היצירה",
|
||||
"Good Response": "תגובה טובה",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "יבוא מיפוי מסמכים",
|
||||
"Import Models": "ייבוא דגמים",
|
||||
"Import Prompts": "יבוא פקודות",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "כלול את הדגל `--api` בעת הרצת stable-diffusion-webui",
|
||||
"Info": "מידע",
|
||||
"Input commands": "פקודות קלט",
|
||||
"Install from Github URL": "התקן מכתובת URL של Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "ממשק",
|
||||
"Invalid Tag": "תג לא חוקי",
|
||||
"January": "ינואר",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "אסימון JWT",
|
||||
"Keep Alive": "השאר פעיל",
|
||||
"Keyboard shortcuts": "קיצורי מקלדת",
|
||||
"Knowledge": "",
|
||||
"Language": "שפה",
|
||||
"Last Active": "פעיל לאחרונה",
|
||||
"Last Modified": "",
|
||||
"Light": "בהיר",
|
||||
"Listening...": "מאזין...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "מודלים בשפה טבעית יכולים לטעות. אמת מידע חשוב.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "נוצר על ידי קהילת OpenWebUI",
|
||||
"Make sure to enclose them with": "ודא להקיף אותם עם",
|
||||
"Manage": "",
|
||||
"Manage Models": "נהל מודלים",
|
||||
"Manage Ollama Models": "נהל מודלים של Ollama",
|
||||
"Manage Pipelines": "ניהול צינורות",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "DD בMMMM, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "DD בMMMM, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "המודל '{{modelName}}' הורד בהצלחה.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "המודל '{{modelTag}}' כבר בתור להורדה.",
|
||||
"Model {{modelId}} not found": "המודל {{modelId}} לא נמצא",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "תן שם לדגם שלך",
|
||||
"New Chat": "צ'אט חדש",
|
||||
"New Password": "סיסמה חדשה",
|
||||
"No documents found": "",
|
||||
"No results found": "לא נמצאו תוצאות",
|
||||
"No search query generated": "לא נוצרה שאילתת חיפוש",
|
||||
"No source available": "אין מקור זמין",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API מושבת",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "גרסת Ollama",
|
||||
"On": "פועל",
|
||||
"Only": "רק",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "מסמך PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)",
|
||||
"pending": "ממתין",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "ההרשאה נדחתה בעת גישה למיקרופון: {{error}}",
|
||||
"Personalization": "תאור",
|
||||
"Pipelines": "צינורות",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "קרא בקול",
|
||||
"Record voice": "הקלט קול",
|
||||
"Redirecting you to OpenWebUI Community": "מפנה אותך לקהילת OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "נדחה כאשר לא היה צריך",
|
||||
"Regenerate": "הפק מחדש",
|
||||
"Release Notes": "הערות שחרור",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "שמור",
|
||||
"Save & Create": "שמור וצור",
|
||||
"Save & Update": "שמור ועדכן",
|
||||
@@ -399,35 +427,41 @@
|
||||
"Search Documents": "חפש מסמכים",
|
||||
"Search Models": "חיפוש מודלים",
|
||||
"Search Prompts": "חפש פקודות",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "ספירת תוצאות חיפוש",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "חיפש {{count}} sites_one",
|
||||
"Searched {{count}} sites_two": "חיפש {{count}} sites_two",
|
||||
"Searched {{count}} sites_other": "חיפש {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "חיפוש באינטרנט אחר '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "כתובת URL של שאילתת Searxng",
|
||||
"See readme.md for instructions": "ראה את readme.md להוראות",
|
||||
"See what's new": "ראה מה חדש",
|
||||
"Seed": "זרע",
|
||||
"Select a base model": "בחירת מודל בסיס",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "בחר מצב",
|
||||
"Select a model": "בחר מודל",
|
||||
"Select a pipeline": "בחר קו צינור",
|
||||
"Select a pipeline url": "בחר כתובת URL של קו צינור",
|
||||
"Select an Ollama instance": "בחר מופע של Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "בחר מודל",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "דגמים נבחרים אינם תומכים בקלט תמונה",
|
||||
"Send": "שלח",
|
||||
"Send a Message": "שלח הודעה",
|
||||
"Send message": "שלח הודעה",
|
||||
"September": "ספטמבר",
|
||||
"Serper API Key": "מפתח Serper API",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "מפתח API של Serpstack",
|
||||
"Server connection verified": "החיבור לשרת אומת",
|
||||
"Set as default": "הגדר כברירת מחדל",
|
||||
"Set Default Model": "הגדר מודל ברירת מחדל",
|
||||
"Set embedding model (e.g. {{model}})": "הגדר מודל הטמעה (למשל {{model}})",
|
||||
"Set Image Size": "הגדר גודל תמונה",
|
||||
"Set Model": "הגדר מודל",
|
||||
"Set reranking model (e.g. {{model}})": "הגדר מודל דירוג מחדש (למשל {{model}})",
|
||||
"Set Steps": "הגדר שלבים",
|
||||
"Set Task Model": "הגדרת מודל משימה",
|
||||
@@ -451,8 +485,8 @@
|
||||
"Source": "מקור",
|
||||
"Speech recognition error: {{error}}": "שגיאת תחקור שמע: {{error}}",
|
||||
"Speech-to-Text Engine": "מנוע תחקור שמע",
|
||||
"SpeechRecognition API is not supported in this browser.": "מנוע תחקור שמע אינו נתמך בדפדפן זה.",
|
||||
"Stop Sequence": "סידור עצירה",
|
||||
"STT Model": "",
|
||||
"STT Settings": "הגדרות חקירה של TTS",
|
||||
"Submit": "שלח",
|
||||
"Subtitle (e.g. about the Roman Empire)": "תחקור (לדוגמה: על מעמד הרומי)",
|
||||
@@ -462,6 +496,7 @@
|
||||
"System": "מערכת",
|
||||
"System Prompt": "תגובת מערכת",
|
||||
"Tags": "תגיות",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "תרשמו יותר:",
|
||||
"Temperature": "טמפרטורה",
|
||||
"Template": "תבנית",
|
||||
@@ -471,7 +506,9 @@
|
||||
"Thanks for your feedback!": "תודה על המשוב שלך!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "ציון צריך להיות ערך בין 0.0 (0%) ל-1.0 (100%)",
|
||||
"Theme": "נושא",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "פעולה זו מבטיחה שהשיחות בעלות הערך שלך יישמרו באופן מאובטח במסד הנתונים העורפי שלך. תודה!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "הגדרה זו אינה מסתנכרנת בין דפדפנים או מכשירים.",
|
||||
"Thorough explanation": "תיאור מפורט",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "טיפ: עדכן חריצים משתנים מרובים ברציפות על-ידי לחיצה על מקש Tab בקלט הצ'אט לאחר כל החלפה.",
|
||||
@@ -483,22 +520,31 @@
|
||||
"to": "ל",
|
||||
"To access the available model names for downloading,": "כדי לגשת לשמות הדגמים הזמינים להורדה,",
|
||||
"To access the GGUF models available for downloading,": "כדי לגשת לדגמי GGUF הזמינים להורדה,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "לקלטת שיחה.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "היום",
|
||||
"Toggle settings": "החלפת מצב של הגדרות",
|
||||
"Toggle sidebar": "החלפת מצב של סרגל הצד",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "קשה לגשת לOllama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "הגדרות TTS",
|
||||
"TTS Voice": "",
|
||||
"Type": "סוג",
|
||||
"Type Hugging Face Resolve (Download) URL": "הקלד כתובת URL של פתרון פנים מחבק (הורד)",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "או-הו! אירעה בעיה בהתחברות ל- {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "סוג קובץ לא ידוע '{{file_type}}', אך מקבל ומתייחס אליו כטקסט רגיל",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "עדכן ושכפל קישור",
|
||||
"Update password": "עדכן סיסמה",
|
||||
"Upload a GGUF model": "העלה מודל GGUF",
|
||||
"Upload Files": "העלאת קבצים",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "תקדמות העלאה",
|
||||
"URL Mode": "מצב URL",
|
||||
"Use '#' in the prompt input to load and select your documents.": "השתמש ב- '#' בקלט הבקשה כדי לטעון ולבחור את המסמכים שלך.",
|
||||
@@ -517,6 +563,7 @@
|
||||
"Warning": "אזהרה",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "אזהרה: אם תעדכן או תשנה את מודל ההטבעה שלך, יהיה עליך לייבא מחדש את כל המסמכים.",
|
||||
"Web": "רשת",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "הגדרות טעינת אתר",
|
||||
"Web Params": "פרמטרים Web",
|
||||
"Web Search": "חיפוש באינטרנט",
|
||||
@@ -527,18 +574,20 @@
|
||||
"WebUI will make requests to": "WebUI יבקש לבקש",
|
||||
"What’s New in": "מה חדש ב",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "כאשר ההיסטוריה מושבתת, צ'אטים חדשים בדפדפן זה לא יופיעו בהיסטוריה שלך באף אחד מהמכשירים שלך.",
|
||||
"Whisper (Local)": "ושפה (מקומית)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "סביבה",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "כתוב הצעה מהירה (למשל, מי אתה?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "כתוב סיכום ב-50 מילים שמסכם [נושא או מילת מפתח].",
|
||||
"Yesterday": "אתמול",
|
||||
"You": "אתה",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "לא ניתן לשכפל מודל בסיס",
|
||||
"You have no archived conversations.": "אין לך שיחות בארכיון.",
|
||||
"You have shared this chat": "שיתפת את השיחה הזו",
|
||||
"You're a helpful assistant.": "אתה עוזר מועיל.",
|
||||
"You're now logged in.": "כעת אתה מחובר.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "הגדרות Youtube Loader"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "एक उपयोगकर्ता",
|
||||
"About": "हमारे बारे में",
|
||||
"Account": "खाता",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "सटीक जानकारी",
|
||||
"Active Users": "",
|
||||
"Add": "जोड़ें",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "उपयोगकर्ता जोड़ें",
|
||||
"Adjusting these settings will apply changes universally to all users.": "इन सेटिंग्स को समायोजित करने से परिवर्तन सभी उपयोगकर्ताओं पर सार्वभौमिक रूप से लागू होंगे।",
|
||||
"admin": "व्यवस्थापक",
|
||||
"Admin": "",
|
||||
"Admin Panel": "व्यवस्थापक पैनल",
|
||||
"Admin Settings": "व्यवस्थापक सेटिंग्स",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "उन्नत पैरामीटर",
|
||||
"Advanced Params": "उन्नत परम",
|
||||
"all": "सभी",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "ऑडियो",
|
||||
"August": "अगस्त",
|
||||
"Auto-playback response": "ऑटो-प्लेबैक प्रतिक्रिया",
|
||||
"Auto-send input after 3 sec.": "3 सेकंड के बाद स्वचालित रूप से इनपुट भेजें।",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 बेस यूआरएल",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 का बेस यूआरएल आवश्यक है।",
|
||||
"available!": "उपलब्ध!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "ख़राब प्रतिक्रिया",
|
||||
"Banners": "बैनर",
|
||||
"Base Model (From)": "बेस मॉडल (से)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "पहले",
|
||||
"Being lazy": "आलसी होना",
|
||||
"Brave Search API Key": "Brave सर्च एपीआई कुंजी",
|
||||
"Bypass SSL verification for Websites": "वेबसाइटों के लिए SSL सुनिश्चिती को छोड़ें",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "रद्द करें",
|
||||
"Capabilities": "क्षमताओं",
|
||||
"Change Password": "पासवर्ड बदलें",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "चंक पैरामीटर्स",
|
||||
"Chunk Size": "चंक आकार",
|
||||
"Citation": "उद्धरण",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "सहायता के लिए यहां क्लिक करें।",
|
||||
"Click here to": "यहां क्लिक करें",
|
||||
"Click here to select": "चयन करने के लिए यहां क्लिक करें।",
|
||||
"Click here to select a csv file.": "सीएसवी फ़ाइल का चयन करने के लिए यहां क्लिक करें।",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "दस्तावेज़ चुनने के लिए यहां क्लिक करें।",
|
||||
"click here.": "यहाँ क्लिक करें।",
|
||||
"Click on the user role button to change a user's role.": "उपयोगकर्ता की भूमिका बदलने के लिए उपयोगकर्ता भूमिका बटन पर क्लिक करें।",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "समवर्ती अनुरोध",
|
||||
"Confirm Password": "पासवर्ड की पुष्टि कीजिये",
|
||||
"Connections": "सम्बन्ध",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "सामग्री",
|
||||
"Context Length": "प्रसंग की लंबाई",
|
||||
"Continue Response": "प्रतिक्रिया जारी रखें",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "बातचीत का मॉड",
|
||||
"Copied shared chat URL to clipboard!": "साझा चैट URL को क्लिपबोर्ड पर कॉपी किया गया!",
|
||||
"Copy": "कॉपी",
|
||||
"Copy last code block": "अंतिम कोड ब्लॉक कॉपी करें",
|
||||
"Copy last response": "अंतिम प्रतिक्रिया कॉपी करें",
|
||||
"Copy Link": "लिंक को कॉपी करें",
|
||||
"Copying to clipboard was successful!": "क्लिपबोर्ड पर कॉपी बनाना सफल रहा!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "निम्नलिखित क्वेरी के लिए हेडर के रूप में एक संक्षिप्त, 3-5 शब्द वाक्यांश बनाएं, 3-5 शब्द सीमा का सख्ती से पालन करें और 'शीर्षक' शब्द के उपयोग से बचें:",
|
||||
"Create a model": "एक मॉडल बनाएं",
|
||||
"Create Account": "खाता बनाएं",
|
||||
"Create new key": "नया क्रिप्टोग्राफिक क्षेत्र बनाएं",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "कस्टम संस्करण",
|
||||
"Customize models for a specific purpose": "एक विशिष्ट उद्देश्य के लिए मॉडल अनुकूलित करें",
|
||||
"Dark": "डार्क",
|
||||
"Dashboard": "",
|
||||
"Database": "डेटाबेस",
|
||||
"December": "डिसेंबर",
|
||||
"Default": "डिफ़ॉल्ट",
|
||||
"Default (Automatic1111)": "डिफ़ॉल्ट (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "डिफ़ॉल्ट (SentenceTransformers)",
|
||||
"Default (Web API)": "डिफ़ॉल्ट (Web API)",
|
||||
"Default Model": "डिफ़ॉल्ट मॉडल",
|
||||
"Default model updated": "डिफ़ॉल्ट मॉडल अपडेट किया गया",
|
||||
"Default Prompt Suggestions": "डिफ़ॉल्ट प्रॉम्प्ट सुझाव",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "प्रॉम्प्ट खोजें",
|
||||
"Discover, download, and explore custom prompts": "कस्टम प्रॉम्प्ट को खोजें, डाउनलोड करें और एक्सप्लोर करें",
|
||||
"Discover, download, and explore model presets": "मॉडल प्रीसेट खोजें, डाउनलोड करें और एक्सप्लोर करें",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "चैट में 'आप' के स्थान पर उपयोगकर्ता नाम प्रदर्शित करें",
|
||||
"Document": "दस्तावेज़",
|
||||
"Document Settings": "दस्तावेज़ सेटिंग्स",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "जैसे '30s', '10m', मान्य समय इकाइयाँ 's', 'm', 'h' हैं।",
|
||||
"Edit": "संपादित करें",
|
||||
"Edit Doc": "दस्तावेज़ संपादित करें",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "यूजर को संपादित करो",
|
||||
"Email": "ईमेल",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "स्कोर दर्ज करें",
|
||||
"Enter Searxng Query URL": "Searxng क्वेरी URL दर्ज करें",
|
||||
"Enter Serper API Key": "Serper API कुंजी दर्ज करें",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "सर्पस्टैक एपीआई कुंजी दर्ज करें",
|
||||
"Enter stop sequence": "स्टॉप अनुक्रम दर्ज करें",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "शीर्ष K दर्ज करें",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "यूआरएल दर्ज करें (उदा. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "यूआरएल दर्ज करें (उदा. http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "निर्यात दस्तावेज़ मैपिंग",
|
||||
"Export Models": "निर्यात मॉडल",
|
||||
"Export Prompts": "प्रॉम्प्ट निर्यात करें",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "एपीआई कुंजी बनाने में विफल.",
|
||||
"Failed to read clipboard contents": "क्लिपबोर्ड सामग्री पढ़ने में विफल",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "फ्रीक्वेंसी पेनल्टी",
|
||||
"General": "सामान्य",
|
||||
"General Settings": "सामान्य सेटिंग्स",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "खोज क्वेरी जनरेट करना",
|
||||
"Generation Info": "जनरेशन की जानकारी",
|
||||
"Good Response": "अच्छी प्रतिक्रिया",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "दस्तावेज़ मैपिंग आयात करें",
|
||||
"Import Models": "आयात मॉडल",
|
||||
"Import Prompts": "प्रॉम्प्ट आयात करें",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui चलाते समय `--api` ध्वज शामिल करें",
|
||||
"Info": "सूचना-विषयक",
|
||||
"Input commands": "इनपुट क命",
|
||||
"Install from Github URL": "Github URL से इंस्टॉल करें",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "इंटरफेस",
|
||||
"Invalid Tag": "अवैध टैग",
|
||||
"January": "जनवरी",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "जट टोकन",
|
||||
"Keep Alive": "क्रियाशील रहो",
|
||||
"Keyboard shortcuts": "कीबोर्ड शॉर्टकट",
|
||||
"Knowledge": "",
|
||||
"Language": "भाषा",
|
||||
"Last Active": "पिछली बार सक्रिय",
|
||||
"Last Modified": "",
|
||||
"Light": "सुन",
|
||||
"Listening...": "सुन रहा हूँ...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "एलएलएम गलतियाँ कर सकते हैं। महत्वपूर्ण जानकारी सत्यापित करें.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "OpenWebUI समुदाय द्वारा निर्मित",
|
||||
"Make sure to enclose them with": "उन्हें संलग्न करना सुनिश्चित करें",
|
||||
"Manage": "",
|
||||
"Manage Models": "मॉडल प्रबंधित करें",
|
||||
"Manage Ollama Models": "Ollama मॉडल प्रबंधित करें",
|
||||
"Manage Pipelines": "पाइपलाइनों का प्रबंधन करें",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "मिरोस्तात ताऊ",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "मॉडल '{{modelName}}' सफलतापूर्वक डाउनलोड हो गया है।",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "मॉडल '{{modelTag}}' पहले से ही डाउनलोड करने के लिए कतार में है।",
|
||||
"Model {{modelId}} not found": "मॉडल {{modelId}} नहीं मिला",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "अपने मॉडल को नाम दें",
|
||||
"New Chat": "नई चैट",
|
||||
"New Password": "नया पासवर्ड",
|
||||
"No documents found": "",
|
||||
"No results found": "कोई परिणाम नहीं मिला",
|
||||
"No search query generated": "कोई खोज क्वेरी जनरेट नहीं हुई",
|
||||
"No source available": "कोई स्रोत उपलब्ध नहीं है",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "ओलामा एपीआई",
|
||||
"Ollama API disabled": "ओलामा एपीआई अक्षम",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama Version",
|
||||
"On": "चालू",
|
||||
"Only": "केवल",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)",
|
||||
"pending": "लंबित",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "माइक्रोफ़ोन तक पहुँचने पर अनुमति अस्वीकृत: {{error}}",
|
||||
"Personalization": "पेरसनलाइज़मेंट",
|
||||
"Pipelines": "पाइपलाइनों",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "जोर से पढ़ें",
|
||||
"Record voice": "आवाज रिकॉर्ड करना",
|
||||
"Redirecting you to OpenWebUI Community": "आपको OpenWebUI समुदाय पर पुनर्निर्देशित किया जा रहा है",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "जब ऐसा नहीं होना चाहिए था तो मना कर दिया",
|
||||
"Regenerate": "पुनः जेनरेट",
|
||||
"Release Notes": "रिलीज नोट्स",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "रोसे पिन",
|
||||
"Rosé Pine Dawn": "रोसे पिन डेन",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "सहेजें",
|
||||
"Save & Create": "सहेजें और बनाएं",
|
||||
"Save & Update": "सहेजें और अपडेट करें",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "दस्तावेज़ खोजें",
|
||||
"Search Models": "मॉडल खोजें",
|
||||
"Search Prompts": "प्रॉम्प्ट खोजें",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "खोज परिणामों की संख्या",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "{{count}} sites_one खोजा गया",
|
||||
"Searched {{count}} sites_other": "{{count}} sites_other खोजा गया",
|
||||
"Searching the web for '{{searchQuery}}'": "वेब पर '{{searchQuery}}' खोजना",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng क्वेरी URL",
|
||||
"See readme.md for instructions": "निर्देशों के लिए readme.md देखें",
|
||||
"See what's new": "देखें, क्या नया है",
|
||||
"Seed": "सीड्\u200c",
|
||||
"Select a base model": "एक आधार मॉडल का चयन करें",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "एक मोड चुनें",
|
||||
"Select a model": "एक मॉडल चुनें",
|
||||
"Select a pipeline": "एक पाइपलाइन का चयन करें",
|
||||
"Select a pipeline url": "एक पाइपलाइन url चुनें",
|
||||
"Select an Ollama instance": "एक Ollama Instance चुनें",
|
||||
"Select Documents": "",
|
||||
"Select model": "मॉडल चुनें",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "चयनित मॉडल छवि इनपुट का समर्थन नहीं करते हैं",
|
||||
"Send": "भेज",
|
||||
"Send a Message": "एक संदेश भेजो",
|
||||
"Send message": "मेसेज भेजें",
|
||||
"September": "सितंबर",
|
||||
"Serper API Key": "Serper API कुंजी",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "सर्पस्टैक एपीआई कुंजी",
|
||||
"Server connection verified": "सर्वर कनेक्शन सत्यापित",
|
||||
"Set as default": "डिफाल्ट के रूप में सेट",
|
||||
"Set Default Model": "डिफ़ॉल्ट मॉडल सेट करें",
|
||||
"Set embedding model (e.g. {{model}})": "ईम्बेडिंग मॉडल सेट करें (उदाहरण: {{model}})",
|
||||
"Set Image Size": "छवि का आकार सेट करें",
|
||||
"Set Model": "मॉडल सेट करें",
|
||||
"Set reranking model (e.g. {{model}})": "रीकरण मॉडल सेट करें (उदाहरण: {{model}})",
|
||||
"Set Steps": "चरण निर्धारित करें",
|
||||
"Set Task Model": "कार्य मॉडल सेट करें",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "स्रोत",
|
||||
"Speech recognition error: {{error}}": "वाक् पहचान त्रुटि: {{error}}",
|
||||
"Speech-to-Text Engine": "वाक्-से-पाठ इंजन",
|
||||
"SpeechRecognition API is not supported in this browser.": "इस ब्राउज़र में SpeechRecognition API समर्थित नहीं है",
|
||||
"Stop Sequence": "अनुक्रम रोकें",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT सेटिंग्स ",
|
||||
"Submit": "सबमिट करें",
|
||||
"Subtitle (e.g. about the Roman Empire)": "उपशीर्षक (जैसे रोमन साम्राज्य के बारे में)",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "सिस्टम",
|
||||
"System Prompt": "सिस्टम प्रॉम्प्ट",
|
||||
"Tags": "टैग",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "हमें और अधिक बताएँ:",
|
||||
"Temperature": "टेंपेरेचर",
|
||||
"Template": "टेम्पलेट",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "आपकी प्रतिक्रिया के लिए धन्यवाद!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "स्कोर का मान 0.0 (0%) और 1.0 (100%) के बीच होना चाहिए।",
|
||||
"Theme": "थीम",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "यह सुनिश्चित करता है कि आपकी मूल्यवान बातचीत आपके बैकएंड डेटाबेस में सुरक्षित रूप से सहेजी गई है। धन्यवाद!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "यह सेटिंग सभी ब्राउज़रों या डिवाइसों में समन्वयित नहीं होती है",
|
||||
"Thorough explanation": "विस्तृत व्याख्या",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "टिप: प्रत्येक प्रतिस्थापन के बाद चैट इनपुट में टैब कुंजी दबाकर लगातार कई वैरिएबल स्लॉट अपडेट करें।",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "तक",
|
||||
"To access the available model names for downloading,": "डाउनलोड करने के लिए उपलब्ध मॉडल नामों तक पहुंचने के लिए,",
|
||||
"To access the GGUF models available for downloading,": "डाउनलोडिंग के लिए उपलब्ध GGUF मॉडल तक पहुँचने के लिए,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "इनपुट चैट करने के लिए.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "आज",
|
||||
"Toggle settings": "सेटिंग्स टॉगल करें",
|
||||
"Toggle sidebar": "साइडबार टॉगल करें",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "शीर्ष K",
|
||||
"Top P": "शीर्ष P",
|
||||
"Trouble accessing Ollama?": "Ollama तक पहुँचने में परेशानी हो रही है?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS सेटिंग्स",
|
||||
"TTS Voice": "",
|
||||
"Type": "प्रकार",
|
||||
"Type Hugging Face Resolve (Download) URL": "हगिंग फेस रिज़ॉल्व (डाउनलोड) यूआरएल टाइप करें",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "उह ओह! {{provider}} से कनेक्ट करने में एक समस्या थी।",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "अज्ञात फ़ाइल प्रकार '{{file_type}}', लेकिन स्वीकार करना और सादे पाठ के रूप में व्यवहार करना",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "अपडेट करें और लिंक कॉपी करें",
|
||||
"Update password": "पासवर्ड अपडेट करें",
|
||||
"Upload a GGUF model": "GGUF मॉडल अपलोड करें",
|
||||
"Upload Files": "फ़ाइलें अपलोड करें",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "प्रगति अपलोड करें",
|
||||
"URL Mode": "URL मोड",
|
||||
"Use '#' in the prompt input to load and select your documents.": "अपने दस्तावेज़ों को लोड करने और चुनने के लिए शीघ्र इनपुट में '#' का उपयोग करें।",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "चेतावनी",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "चेतावनी: यदि आप अपने एम्बेडिंग मॉडल को अपडेट या बदलते हैं, तो आपको सभी दस्तावेज़ों को फिर से आयात करने की आवश्यकता होगी।",
|
||||
"Web": "वेब",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "वेब लोडर सेटिंग्स",
|
||||
"Web Params": "वेब पैरामीटर",
|
||||
"Web Search": "वेब खोज",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "WebUI अनुरोध करेगा",
|
||||
"What’s New in": "इसमें नया क्या है",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "जब इतिहास बंद हो जाता है, तो इस ब्राउज़र पर नई चैट आपके किसी भी डिवाइस पर इतिहास में दिखाई नहीं देंगी।",
|
||||
"Whisper (Local)": "Whisper (स्थानीय)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "वर्कस्पेस",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "एक त्वरित सुझाव लिखें (जैसे कि आप कौन हैं?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "50 शब्दों में एक सारांश लिखें जो [विषय या कीवर्ड] का सारांश प्रस्तुत करता हो।",
|
||||
"Yesterday": "कल",
|
||||
"You": "आप",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "आप बेस मॉडल का क्लोन नहीं बना सकते",
|
||||
"You have no archived conversations.": "आपको कोई अंकित चैट नहीं है।",
|
||||
"You have shared this chat": "आपने इस चैट को शेयर किया है",
|
||||
"You're a helpful assistant.": "आप एक सहायक सहायक हैं",
|
||||
"You're now logged in.": "अब आप लॉग इन हो गए हैं",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "यूट्यूब लोडर सेटिंग्स"
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(npr. `sh webui.sh --api`)",
|
||||
"(latest)": "(najnovije)",
|
||||
"{{ models }}": "{{ modeli }}",
|
||||
"{{ owner }}: You cannot delete a base model": "{{ vlasnik }}: ne možete izbrisati osnovni model",
|
||||
"{{ owner }}: You cannot delete a base model": "{{ owner }}: Ne možete obrisati osnovni model",
|
||||
"{{modelName}} is thinking...": "{{modelName}} razmišlja...",
|
||||
"{{user}}'s Chats": "Razgovori korisnika {{user}}",
|
||||
"{{webUIName}} Backend Required": "{{webUIName}} Backend je potreban",
|
||||
@@ -12,8 +12,9 @@
|
||||
"a user": "korisnik",
|
||||
"About": "O aplikaciji",
|
||||
"Account": "Račun",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Točne informacije",
|
||||
"Active Users": "",
|
||||
"Active Users": "Aktivni korisnici",
|
||||
"Add": "Dodaj",
|
||||
"Add a model id": "Dodavanje ID-a modela",
|
||||
"Add a short description about what this model does": "Dodajte kratak opis funkcija ovog modela",
|
||||
@@ -29,16 +30,18 @@
|
||||
"Add User": "Dodaj korisnika",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Podešavanje će se primijeniti univerzalno na sve korisnike.",
|
||||
"admin": "administrator",
|
||||
"Admin Panel": "Administratorska ploča",
|
||||
"Admin Settings": "Administratorske postavke",
|
||||
"Admin": "Admin",
|
||||
"Admin Panel": "Admin ploča",
|
||||
"Admin Settings": "Admin postavke",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Napredni parametri",
|
||||
"Advanced Params": "Napredni parami",
|
||||
"Advanced Params": "Napredni parametri",
|
||||
"all": "sve",
|
||||
"All Documents": "Svi dokumenti",
|
||||
"All Users": "Svi korisnici",
|
||||
"Allow": "Dopusti",
|
||||
"Allow Chat Deletion": "Dopusti brisanje razgovora",
|
||||
"Allow non-local voices": "",
|
||||
"Allow non-local voices": "Dopusti nelokalne glasove",
|
||||
"alphanumeric characters and hyphens": "alfanumerički znakovi i crtice",
|
||||
"Already have an account?": "Već imate račun?",
|
||||
"an assistant": "asistent",
|
||||
@@ -50,7 +53,7 @@
|
||||
"API keys": "API ključevi",
|
||||
"April": "Travanj",
|
||||
"Archive": "Arhiva",
|
||||
"Archive All Chats": "Arhiviraj sve razgovore",
|
||||
"Archive All Chats": "Arhivirajte sve razgovore",
|
||||
"Archived Chats": "Arhivirani razgovori",
|
||||
"are allowed - Activate this command by typing": "su dopušteni - Aktivirajte ovu naredbu upisivanjem",
|
||||
"Are you sure?": "Jeste li sigurni?",
|
||||
@@ -59,18 +62,21 @@
|
||||
"Audio": "Audio",
|
||||
"August": "Kolovoz",
|
||||
"Auto-playback response": "Automatska reprodukcija odgovora",
|
||||
"Auto-send input after 3 sec.": "Automatsko slanje unosa nakon 3 sek.",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 osnovni URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "Potreban je AUTOMATIC1111 osnovni URL.",
|
||||
"available!": "dostupno!",
|
||||
"Back": "Natrag",
|
||||
"Bad Response": "Loš odgovor",
|
||||
"Banners": "Bannere",
|
||||
"Base Model (From)": "Osnovni model (šalje)",
|
||||
"Banners": "Baneri",
|
||||
"Base Model (From)": "Osnovni model (Od)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "prije",
|
||||
"Being lazy": "Biti lijen",
|
||||
"Brave Search API Key": "Ključ API-ja za hrabro pretraživanje",
|
||||
"Brave Search API Key": "Brave tražilica - API ključ",
|
||||
"Bypass SSL verification for Websites": "Zaobiđi SSL provjeru za web stranice",
|
||||
"Call": "Poziv",
|
||||
"Call feature is not supported when using Web STT engine": "Značajka poziva nije podržana kada se koristi Web STT mehanizam",
|
||||
"Camera": "Kamera",
|
||||
"Cancel": "Otkaži",
|
||||
"Capabilities": "Mogućnosti",
|
||||
"Change Password": "Promijeni lozinku",
|
||||
@@ -88,14 +94,16 @@
|
||||
"Chunk Params": "Parametri dijelova",
|
||||
"Chunk Size": "Veličina dijela",
|
||||
"Citation": "Citiranje",
|
||||
"Clear memory": "Očisti memoriju",
|
||||
"Click here for help.": "Kliknite ovdje za pomoć.",
|
||||
"Click here to": "Kliknite ovdje za",
|
||||
"Click here to select": "Kliknite ovdje za odabir",
|
||||
"Click here to select a csv file.": "Kliknite ovdje da odaberete csv datoteku.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Kliknite ovdje da odaberete dokumente.",
|
||||
"click here.": "kliknite ovdje.",
|
||||
"Click on the user role button to change a user's role.": "Kliknite na gumb uloge korisnika za promjenu uloge korisnika.",
|
||||
"Clone": "Klon",
|
||||
"Clone": "Kloniraj",
|
||||
"Close": "Zatvori",
|
||||
"Collection": "Kolekcija",
|
||||
"ComfyUI": "ComfyUI",
|
||||
@@ -105,19 +113,18 @@
|
||||
"Concurrent Requests": "Istodobni zahtjevi",
|
||||
"Confirm Password": "Potvrdite lozinku",
|
||||
"Connections": "Povezivanja",
|
||||
"Contact Admin for WebUI Access": "Kontaktirajte admina za WebUI pristup",
|
||||
"Content": "Sadržaj",
|
||||
"Context Length": "Dužina konteksta",
|
||||
"Continue Response": "Nastavi odgovor",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Način razgovora",
|
||||
"Copied shared chat URL to clipboard!": "URL dijeljenog razgovora kopiran u međuspremnik!",
|
||||
"Copy": "Kopiraj",
|
||||
"Copy last code block": "Kopiraj zadnji blok koda",
|
||||
"Copy last response": "Kopiraj zadnji odgovor",
|
||||
"Copy Link": "Kopiraj vezu",
|
||||
"Copying to clipboard was successful!": "Kopiranje u međuspremnik je uspješno!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Stvorite sažetu frazu od 3-5 riječi kao naslov za sljedeći upit, strogo se pridržavajući ograničenja od 3-5 riječi i izbjegavajući upotrebu riječi 'naslov':",
|
||||
"Create a model": "Stvaranje modela",
|
||||
"Create a model": "Izradite model",
|
||||
"Create Account": "Stvori račun",
|
||||
"Create new key": "Stvori novi ključ",
|
||||
"Create new secret key": "Stvori novi tajni ključ",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Prilagođeno",
|
||||
"Customize models for a specific purpose": "Prilagodba modela za određenu svrhu",
|
||||
"Dark": "Tamno",
|
||||
"Dashboard": "Radna ploča",
|
||||
"Database": "Baza podataka",
|
||||
"December": "Prosinac",
|
||||
"Default": "Zadano",
|
||||
"Default (Automatic1111)": "Zadano (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Zadano (SentenceTransformers)",
|
||||
"Default (Web API)": "Zadano (Web API)",
|
||||
"Default Model": "Zadani model",
|
||||
"Default model updated": "Zadani model ažuriran",
|
||||
"Default Prompt Suggestions": "Zadani prijedlozi prompta",
|
||||
@@ -154,10 +161,12 @@
|
||||
"Discover a prompt": "Otkrijte prompt",
|
||||
"Discover, download, and explore custom prompts": "Otkrijte, preuzmite i istražite prilagođene prompte",
|
||||
"Discover, download, and explore model presets": "Otkrijte, preuzmite i istražite unaprijed postavljene modele",
|
||||
"Dismissible": "Odbaciti",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Prikaži korisničko ime umjesto Vas u razgovoru",
|
||||
"Document": "Dokument",
|
||||
"Document Settings": "Postavke dokumenta",
|
||||
"Documentation": "",
|
||||
"Documentation": "Dokumentacija",
|
||||
"Documents": "Dokumenti",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne uspostavlja vanjske veze, a vaši podaci ostaju sigurno na vašem lokalno hostiranom poslužitelju.",
|
||||
"Don't Allow": "Ne dopuštaj",
|
||||
@@ -170,9 +179,10 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "npr. '30s','10m'. Važeće vremenske jedinice su 's', 'm', 'h'.",
|
||||
"Edit": "Uredi",
|
||||
"Edit Doc": "Uredi dokument",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Uredi korisnika",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Batch Size": "Embedding - Veličina batch-a",
|
||||
"Embedding Model": "Embedding model",
|
||||
"Embedding Model Engine": "Embedding model pogon",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding model postavljen na \"{{embedding_model}}\"",
|
||||
@@ -183,7 +193,7 @@
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Provjerite da vaša CSV datoteka uključuje 4 stupca u ovom redoslijedu: Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "Unesite {{role}} poruku ovdje",
|
||||
"Enter a detail about yourself for your LLMs to recall": "Unesite pojedinosti o sebi da bi učitali memoriju u LLM",
|
||||
"Enter Brave Search API Key": "Unesite ključ API-ja za hrabro pretraživanje",
|
||||
"Enter Brave Search API Key": "Unesite Brave Search API ključ",
|
||||
"Enter Chunk Overlap": "Unesite preklapanje dijelova",
|
||||
"Enter Chunk Size": "Unesite veličinu dijela",
|
||||
"Enter Github Raw URL": "Unesite Github sirovi URL",
|
||||
@@ -194,10 +204,12 @@
|
||||
"Enter model tag (e.g. {{modelTag}})": "Unesite oznaku modela (npr. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Unesite broj koraka (npr. 50)",
|
||||
"Enter Score": "Unesite ocjenu",
|
||||
"Enter Searxng Query URL": "Unos URL-a upita Searxng",
|
||||
"Enter Serper API Key": "Unesite API ključ serpera",
|
||||
"Enter Serpstack API Key": "Unesite API ključ Serpstack",
|
||||
"Enter Searxng Query URL": "Unesite URL upita Searxng",
|
||||
"Enter Serper API Key": "Unesite Serper API ključ",
|
||||
"Enter Serply API Key": "Unesite Serply API ključ",
|
||||
"Enter Serpstack API Key": "Unesite Serpstack API ključ",
|
||||
"Enter stop sequence": "Unesite sekvencu zaustavljanja",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Unesite Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Unesite URL (npr. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Unesite URL (npr. http://localhost:11434)",
|
||||
@@ -209,14 +221,16 @@
|
||||
"Experimental": "Eksperimentalno",
|
||||
"Export": "Izvoz",
|
||||
"Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)",
|
||||
"Export chat (.json)": "",
|
||||
"Export chat (.json)": "Izvoz četa (.json)",
|
||||
"Export Chats": "Izvoz razgovora",
|
||||
"Export Documents Mapping": "Izvoz mapiranja dokumenata",
|
||||
"Export Models": "Izvezi modele",
|
||||
"Export Models": "Izvoz modela",
|
||||
"Export Prompts": "Izvoz prompta",
|
||||
"Export Tools": "Izvoz alata",
|
||||
"External Models": "Vanjski modeli",
|
||||
"Failed to create API Key.": "Neuspješno stvaranje API ključa.",
|
||||
"Failed to read clipboard contents": "Neuspješno čitanje sadržaja međuspremnika",
|
||||
"Failed to update settings": "",
|
||||
"Failed to update settings": "Greška kod ažuriranja postavki",
|
||||
"February": "Veljača",
|
||||
"Feel free to add specific details": "Slobodno dodajte specifične detalje",
|
||||
"File Mode": "Način datoteke",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Kazna za učestalost",
|
||||
"General": "Općenito",
|
||||
"General Settings": "Opće postavke",
|
||||
"Generate Image": "Gneriraj sliku",
|
||||
"Generating search query": "Generiranje upita za pretraživanje",
|
||||
"Generation Info": "Informacije o generaciji",
|
||||
"Good Response": "Dobar odgovor",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Uvoz mapiranja dokumenata",
|
||||
"Import Models": "Uvoz modela",
|
||||
"Import Prompts": "Uvoz prompta",
|
||||
"Import Tools": "Uvoz alata",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Uključite zastavicu `--api` prilikom pokretanja stable-diffusion-webui",
|
||||
"Info": "Informacije",
|
||||
"Input commands": "Unos naredbi",
|
||||
"Install from Github URL": "Instaliraj s Github URL-a",
|
||||
"Instant Auto-Send After Voice Transcription": "Trenutačno automatsko slanje nakon glasovne transkripcije",
|
||||
"Interface": "Sučelje",
|
||||
"Invalid Tag": "Nevažeća oznaka",
|
||||
"January": "Siječanj",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT token",
|
||||
"Keep Alive": "Održavanje živim",
|
||||
"Keyboard shortcuts": "Tipkovnički prečaci",
|
||||
"Knowledge": "Znanje",
|
||||
"Language": "Jezik",
|
||||
"Last Active": "Zadnja aktivnost",
|
||||
"Last Modified": "",
|
||||
"Light": "Svijetlo",
|
||||
"Listening...": "Slušam...",
|
||||
"LLMs can make mistakes. Verify important information.": "LLM-ovi mogu pogriješiti. Provjerite važne informacije.",
|
||||
"Local Models": "Lokalni modeli",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Izradio OpenWebUI Community",
|
||||
"Make sure to enclose them with": "Provjerite da ih zatvorite s",
|
||||
"Manage": "Upravljaj",
|
||||
"Manage Models": "Upravljanje modelima",
|
||||
"Manage Ollama Models": "Upravljanje Ollama modelima",
|
||||
"Manage Pipelines": "Upravljanje cjevovodima",
|
||||
@@ -289,16 +310,17 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' je uspješno preuzet.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' je već u redu za preuzimanje.",
|
||||
"Model {{modelId}} not found": "Model {{modelId}} nije pronađen",
|
||||
"Model {{modelName}} is not vision capable": "Model {{modelName}} nije sposoban za vid",
|
||||
"Model {{modelName}} is not vision capable": "Model {{modelName}} ne čita vizualne impute",
|
||||
"Model {{name}} is now {{status}}": "Model {{name}} sada je {{status}}",
|
||||
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Otkriven put datotečnog sustava modela. Kratko ime modela je potrebno za ažuriranje, nije moguće nastaviti.",
|
||||
"Model ID": "ID modela",
|
||||
"Model not selected": "Model nije odabran",
|
||||
"Model Params": "Model Params",
|
||||
"Model Whitelisting": "Bijela lista modela",
|
||||
"Model Params": "Model parametri",
|
||||
"Model Whitelisting": "Model - Bijela lista",
|
||||
"Model(s) Whitelisted": "Model(i) na bijeloj listi",
|
||||
"Modelfile Content": "Sadržaj datoteke modela",
|
||||
"Models": "Modeli",
|
||||
@@ -308,10 +330,11 @@
|
||||
"Name your model": "Dodijelite naziv modelu",
|
||||
"New Chat": "Novi razgovor",
|
||||
"New Password": "Nova lozinka",
|
||||
"No documents found": "Dokumenti nisu pronađeni",
|
||||
"No results found": "Nema rezultata",
|
||||
"No search query generated": "Nije generiran upit za pretraživanje",
|
||||
"No source available": "Nema dostupnog izvora",
|
||||
"None": "Nijedan",
|
||||
"None": "Ništa",
|
||||
"Not factually correct": "Nije činjenično točno",
|
||||
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Napomena: Ako postavite minimalnu ocjenu, pretraga će vratiti samo dokumente s ocjenom većom ili jednakom minimalnoj ocjeni.",
|
||||
"Notifications": "Obavijesti",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API je onemogućen",
|
||||
"Ollama API is disabled": "Ollama API je onemogućen",
|
||||
"Ollama Version": "Ollama verzija",
|
||||
"On": "Uključeno",
|
||||
"Only": "Samo",
|
||||
@@ -346,10 +370,12 @@
|
||||
"PDF document (.pdf)": "PDF dokument (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
|
||||
"pending": "u tijeku",
|
||||
"Permission denied when accessing media devices": "Dopuštenje je odbijeno prilikom pristupa medijskim uređajima",
|
||||
"Permission denied when accessing microphone": "Dopuštenje je odbijeno prilikom pristupa mikrofonu",
|
||||
"Permission denied when accessing microphone: {{error}}": "Pristup mikrofonu odbijen: {{error}}",
|
||||
"Personalization": "Prilagodba",
|
||||
"Pipelines": "Cjevovodima",
|
||||
"Pipelines Valves": "Cjevovodi, ventili",
|
||||
"Pipelines": "Cjevovodi",
|
||||
"Pipelines Valves": "Ventili za cjevovode",
|
||||
"Plain text (.txt)": "Običan tekst (.txt)",
|
||||
"Playground": "Igralište",
|
||||
"Positive attitude": "Pozitivan stav",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Čitaj naglas",
|
||||
"Record voice": "Snimanje glasa",
|
||||
"Redirecting you to OpenWebUI Community": "Preusmjeravanje na OpenWebUI zajednicu",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Nazivajte se \"Korisnik\" (npr. \"Korisnik uči španjolski\")",
|
||||
"Refused when it shouldn't have": "Odbijen kada nije trebao biti",
|
||||
"Regenerate": "Regeneriraj",
|
||||
"Release Notes": "Bilješke o izdanju",
|
||||
@@ -379,13 +406,14 @@
|
||||
"Reranking Model": "Model za ponovno rangiranje",
|
||||
"Reranking model disabled": "Model za ponovno rangiranje onemogućen",
|
||||
"Reranking model set to \"{{reranking_model}}\"": "Model za ponovno rangiranje postavljen na \"{{reranking_model}}\"",
|
||||
"Reset Upload Directory": "",
|
||||
"Reset Upload Directory": "Poništi upload direktorij",
|
||||
"Reset Vector Storage": "Resetiraj pohranu vektora",
|
||||
"Response AutoCopy to Clipboard": "Automatsko kopiranje odgovora u međuspremnik",
|
||||
"Role": "Uloga",
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "Pokrenuto",
|
||||
"Save": "Spremi",
|
||||
"Save & Create": "Spremi i stvori",
|
||||
"Save & Update": "Spremi i ažuriraj",
|
||||
@@ -397,44 +425,50 @@
|
||||
"Search a model": "Pretraži model",
|
||||
"Search Chats": "Pretraži razgovore",
|
||||
"Search Documents": "Pretraga dokumenata",
|
||||
"Search Models": "Modeli pretraživanja",
|
||||
"Search Models": "Pretražite modele",
|
||||
"Search Prompts": "Pretraga prompta",
|
||||
"Search Query Generation Prompt": "Upit za generiranje upita za pretraživanje",
|
||||
"Search Query Generation Prompt Length Threshold": "Prag duljine upita za generiranje upita za pretraživanje",
|
||||
"Search Result Count": "Broj rezultata pretraživanja",
|
||||
"Search Tools": "Alati za pretraživanje",
|
||||
"Searched {{count}} sites_one": "Pretraženo {{count}} sites_one",
|
||||
"Searched {{count}} sites_few": "Pretraženo {{count}} sites_few",
|
||||
"Searched {{count}} sites_other": "Pretraženo {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Traženje '{{searchQuery}}' na webu",
|
||||
"Searxng Query URL": "URL upita Searxng",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng URL upita",
|
||||
"See readme.md for instructions": "Pogledajte readme.md za upute",
|
||||
"See what's new": "Pogledajte što je novo",
|
||||
"Seed": "Sjeme",
|
||||
"Select a base model": "Odabir osnovnog modela",
|
||||
"Select a engine": "Odaberite pogon",
|
||||
"Select a mode": "Odaberite način",
|
||||
"Select a model": "Odaberite model",
|
||||
"Select a pipeline": "Odabir kanala",
|
||||
"Select a pipeline url": "Odabir URL-a kanala",
|
||||
"Select an Ollama instance": "Odaberite Ollama instancu",
|
||||
"Select Documents": "Odaberite dokumente",
|
||||
"Select model": "Odaberite model",
|
||||
"Select only one model to call": "Odaberite samo jedan model za poziv",
|
||||
"Selected model(s) do not support image inputs": "Odabrani modeli ne podržavaju unose slika",
|
||||
"Send": "Pošalji",
|
||||
"Send a Message": "Pošaljite poruku",
|
||||
"Send message": "Pošalji poruku",
|
||||
"September": "Rujan",
|
||||
"Serper API Key": "Serper API ključ",
|
||||
"Serpstack API Key": "Tipka API za serpstack",
|
||||
"Serply API Key": "Serply API ključ",
|
||||
"Serpstack API Key": "Serpstack API API ključ",
|
||||
"Server connection verified": "Veza s poslužiteljem potvrđena",
|
||||
"Set as default": "Postavi kao zadano",
|
||||
"Set Default Model": "Postavi zadani model",
|
||||
"Set embedding model (e.g. {{model}})": "Postavi model za embedding (npr. {{model}})",
|
||||
"Set Image Size": "Postavi veličinu slike",
|
||||
"Set Model": "Postavi model",
|
||||
"Set reranking model (e.g. {{model}})": "Postavi model za ponovno rangiranje (npr. {{model}})",
|
||||
"Set Steps": "Postavi korake",
|
||||
"Set Task Model": "Postavi model zadatka",
|
||||
"Set Task Model": "Postavite model zadatka",
|
||||
"Set Voice": "Postavi glas",
|
||||
"Settings": "Postavke",
|
||||
"Settings saved successfully!": "Postavke su uspješno spremljene!",
|
||||
"Settings updated successfully": "",
|
||||
"Settings updated successfully": "Postavke uspješno ažurirane",
|
||||
"Share": "Podijeli",
|
||||
"Share Chat": "Podijeli razgovor",
|
||||
"Share to OpenWebUI Community": "Podijeli u OpenWebUI zajednici",
|
||||
@@ -451,8 +485,8 @@
|
||||
"Source": "Izvor",
|
||||
"Speech recognition error: {{error}}": "Pogreška prepoznavanja govora: {{error}}",
|
||||
"Speech-to-Text Engine": "Stroj za prepoznavanje govora",
|
||||
"SpeechRecognition API is not supported in this browser.": "API za prepoznavanje govora nije podržan u ovom pregledniku.",
|
||||
"Stop Sequence": "Zaustavi sekvencu",
|
||||
"STT Model": "STT model",
|
||||
"STT Settings": "STT postavke",
|
||||
"Submit": "Pošalji",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Podnaslov (npr. o Rimskom carstvu)",
|
||||
@@ -462,6 +496,7 @@
|
||||
"System": "Sustav",
|
||||
"System Prompt": "Sistemski prompt",
|
||||
"Tags": "Oznake",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Recite nam više:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Predložak",
|
||||
@@ -471,7 +506,9 @@
|
||||
"Thanks for your feedback!": "Hvala na povratnim informacijama!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Ocjena treba biti vrijednost između 0,0 (0%) i 1,0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "Razmišljam",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ovo osigurava da su vaši vrijedni razgovori sigurno spremljeni u bazu podataka. Hvala vam!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Ovo je eksperimentalna značajka, možda neće funkcionirati prema očekivanjima i podložna je promjenama u bilo kojem trenutku.",
|
||||
"This setting does not sync across browsers or devices.": "Ova postavka se ne sinkronizira između preglednika ili uređaja.",
|
||||
"Thorough explanation": "Detaljno objašnjenje",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Savjet: Ažurirajte više mjesta za varijable uzastopno pritiskom na tipku tab u unosu razgovora nakon svake zamjene.",
|
||||
@@ -483,22 +520,31 @@
|
||||
"to": "do",
|
||||
"To access the available model names for downloading,": "Za pristup dostupnim nazivima modela za preuzimanje,",
|
||||
"To access the GGUF models available for downloading,": "Za pristup GGUF modelima dostupnim za preuzimanje,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Za pristup WebUI-u obratite se administratoru. Administratori mogu upravljati statusima korisnika s Admin panela.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Da biste ovdje dodali dokumente, prvo ih prenesite u radni prostor \"Dokumenti\".",
|
||||
"to chat input.": "u unos razgovora.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Danas",
|
||||
"Toggle settings": "Prebaci postavke",
|
||||
"Toggle sidebar": "Prebaci bočnu traku",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "Alati",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemi s pristupom Ollama?",
|
||||
"TTS Model": "TTS model",
|
||||
"TTS Settings": "TTS postavke",
|
||||
"TTS Voice": "TTS glas",
|
||||
"Type": "Tip",
|
||||
"Type Hugging Face Resolve (Download) URL": "Upišite Hugging Face Resolve (Download) URL",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Pojavio se problem s povezivanjem na {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Nepoznata vrsta datoteke '{{file_type}}', ali prihvaćena i obrađuje se kao običan tekst",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Ažuriraj i kopiraj vezu",
|
||||
"Update password": "Ažuriraj lozinku",
|
||||
"Upload a GGUF model": "Učitaj GGUF model",
|
||||
"Upload Files": "Prenesi datoteke",
|
||||
"Upload Files": "Prijenos datoteka",
|
||||
"Upload Pipeline": "Prijenos kanala",
|
||||
"Upload Progress": "Napredak učitavanja",
|
||||
"URL Mode": "URL način",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Koristite '#' u unosu prompta za učitavanje i odabir vaših dokumenata.",
|
||||
@@ -517,10 +563,11 @@
|
||||
"Warning": "Upozorenje",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Upozorenje: Ako ažurirate ili promijenite svoj model za umetanje, morat ćete ponovno uvesti sve dokumente.",
|
||||
"Web": "Web",
|
||||
"Web API": "Web API",
|
||||
"Web Loader Settings": "Postavke web učitavanja",
|
||||
"Web Params": "Web parametri",
|
||||
"Web Search": "Web-pretraživanje",
|
||||
"Web Search Engine": "Web-tražilica",
|
||||
"Web Search": "Internet pretraga",
|
||||
"Web Search Engine": "Web tražilica",
|
||||
"Webhook URL": "URL webkuke",
|
||||
"WebUI Add-ons": "Dodaci za WebUI",
|
||||
"WebUI Settings": "WebUI postavke",
|
||||
@@ -528,17 +575,19 @@
|
||||
"What’s New in": "Što je novo u",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kada je povijest isključena, novi razgovori na ovom pregledniku neće se pojaviti u vašoj povijesti na bilo kojem od vaših uređaja.",
|
||||
"Whisper (Local)": "Whisper (lokalno)",
|
||||
"Widescreen Mode": "",
|
||||
"Widescreen Mode": "Mod širokog zaslona",
|
||||
"Workspace": "Radna ploča",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Napišite prijedlog prompta (npr. Tko si ti?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Napišite sažetak u 50 riječi koji sažima [temu ili ključnu riječ].",
|
||||
"Yesterday": "Jučer",
|
||||
"You": "Vi",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Možete personalizirati svoje interakcije s LLM-ima dodavanjem uspomena putem gumba 'Upravljanje' u nastavku, čineći ih korisnijima i prilagođenijima vama.",
|
||||
"You cannot clone a base model": "Ne možete klonirati osnovni model",
|
||||
"You have no archived conversations.": "Nemate arhiviranih razgovora.",
|
||||
"You have shared this chat": "Podijelili ste ovaj razgovor",
|
||||
"You're a helpful assistant.": "Vi ste korisni asistent.",
|
||||
"You're now logged in.": "Sada ste prijavljeni.",
|
||||
"Your account status is currently pending activation.": "Status vašeg računa trenutno čeka aktivaciju.",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "YouTube postavke učitavanja"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "un utente",
|
||||
"About": "Informazioni",
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Informazioni accurate",
|
||||
"Active Users": "",
|
||||
"Add": "Aggiungi",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Aggiungi utente",
|
||||
"Adjusting these settings will apply changes universally to all users.": "La modifica di queste impostazioni applicherà le modifiche universalmente a tutti gli utenti.",
|
||||
"admin": "amministratore",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Pannello di amministrazione",
|
||||
"Admin Settings": "Impostazioni amministratore",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Parametri avanzati",
|
||||
"Advanced Params": "Parametri avanzati",
|
||||
"all": "tutti",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Audio",
|
||||
"August": "Agosto",
|
||||
"Auto-playback response": "Riproduzione automatica della risposta",
|
||||
"Auto-send input after 3 sec.": "Invio automatico dell'input dopo 3 secondi.",
|
||||
"AUTOMATIC1111 Base URL": "URL base AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "L'URL base AUTOMATIC1111 è obbligatorio.",
|
||||
"available!": "disponibile!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Risposta non valida",
|
||||
"Banners": "Banner",
|
||||
"Base Model (From)": "Modello base (da)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "prima",
|
||||
"Being lazy": "Essere pigri",
|
||||
"Brave Search API Key": "Chiave API di ricerca Brave",
|
||||
"Bypass SSL verification for Websites": "Aggira la verifica SSL per i siti web",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Annulla",
|
||||
"Capabilities": "Funzionalità",
|
||||
"Change Password": "Cambia password",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Parametri chunk",
|
||||
"Chunk Size": "Dimensione chunk",
|
||||
"Citation": "Citazione",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Clicca qui per aiuto.",
|
||||
"Click here to": "Clicca qui per",
|
||||
"Click here to select": "Clicca qui per selezionare",
|
||||
"Click here to select a csv file.": "Clicca qui per selezionare un file csv.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Clicca qui per selezionare i documenti.",
|
||||
"click here.": "clicca qui.",
|
||||
"Click on the user role button to change a user's role.": "Clicca sul pulsante del ruolo utente per modificare il ruolo di un utente.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Richieste simultanee",
|
||||
"Confirm Password": "Conferma password",
|
||||
"Connections": "Connessioni",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Contenuto",
|
||||
"Context Length": "Lunghezza contesto",
|
||||
"Continue Response": "Continua risposta",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Modalità conversazione",
|
||||
"Copied shared chat URL to clipboard!": "URL della chat condivisa copiato negli appunti!",
|
||||
"Copy": "Copia",
|
||||
"Copy last code block": "Copia ultimo blocco di codice",
|
||||
"Copy last response": "Copia ultima risposta",
|
||||
"Copy Link": "Copia link",
|
||||
"Copying to clipboard was successful!": "Copia negli appunti riuscita!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Crea una frase concisa di 3-5 parole come intestazione per la seguente query, aderendo rigorosamente al limite di 3-5 parole ed evitando l'uso della parola 'titolo':",
|
||||
"Create a model": "Creare un modello",
|
||||
"Create Account": "Crea account",
|
||||
"Create new key": "Crea nuova chiave",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Personalizzato",
|
||||
"Customize models for a specific purpose": "Personalizza i modelli per uno scopo specifico",
|
||||
"Dark": "Scuro",
|
||||
"Dashboard": "",
|
||||
"Database": "Database",
|
||||
"December": "Dicembre",
|
||||
"Default": "Predefinito",
|
||||
"Default (Automatic1111)": "Predefinito (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Predefinito (SentenceTransformers)",
|
||||
"Default (Web API)": "Predefinito (API Web)",
|
||||
"Default Model": "Modello di default",
|
||||
"Default model updated": "Modello predefinito aggiornato",
|
||||
"Default Prompt Suggestions": "Suggerimenti prompt predefiniti",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Scopri un prompt",
|
||||
"Discover, download, and explore custom prompts": "Scopri, scarica ed esplora prompt personalizzati",
|
||||
"Discover, download, and explore model presets": "Scopri, scarica ed esplora i preset del modello",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Visualizza il nome utente invece di Tu nella chat",
|
||||
"Document": "Documento",
|
||||
"Document Settings": "Impostazioni documento",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "ad esempio '30s','10m'. Le unità di tempo valide sono 's', 'm', 'h'.",
|
||||
"Edit": "Modifica",
|
||||
"Edit Doc": "Modifica documento",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Modifica utente",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Inserisci il punteggio",
|
||||
"Enter Searxng Query URL": "Immettere l'URL della query Searxng",
|
||||
"Enter Serper API Key": "Inserisci la chiave API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Inserisci la chiave API Serpstack",
|
||||
"Enter stop sequence": "Inserisci la sequenza di arresto",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Inserisci Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Inserisci URL (ad esempio http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Inserisci URL (ad esempio http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Esporta mappatura documenti",
|
||||
"Export Models": "Esporta modelli",
|
||||
"Export Prompts": "Esporta prompt",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Impossibile creare la chiave API.",
|
||||
"Failed to read clipboard contents": "Impossibile leggere il contenuto degli appunti",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Penalità di frequenza",
|
||||
"General": "Generale",
|
||||
"General Settings": "Impostazioni generali",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Generazione di query di ricerca",
|
||||
"Generation Info": "Informazioni generazione",
|
||||
"Good Response": "Buona risposta",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Importa mappatura documenti",
|
||||
"Import Models": "Importazione di modelli",
|
||||
"Import Prompts": "Importa prompt",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Includi il flag `--api` quando esegui stable-diffusion-webui",
|
||||
"Info": "Informazioni",
|
||||
"Input commands": "Comandi di input",
|
||||
"Install from Github URL": "Eseguire l'installazione dall'URL di Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Interfaccia",
|
||||
"Invalid Tag": "Tag non valido",
|
||||
"January": "Gennaio",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "Token JWT",
|
||||
"Keep Alive": "Mantieni attivo",
|
||||
"Keyboard shortcuts": "Scorciatoie da tastiera",
|
||||
"Knowledge": "",
|
||||
"Language": "Lingua",
|
||||
"Last Active": "Ultima attività",
|
||||
"Last Modified": "",
|
||||
"Light": "Chiaro",
|
||||
"Listening...": "Ascolto...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "Gli LLM possono commettere errori. Verifica le informazioni importanti.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Realizzato dalla comunità OpenWebUI",
|
||||
"Make sure to enclose them with": "Assicurati di racchiuderli con",
|
||||
"Manage": "",
|
||||
"Manage Models": "Gestisci modelli",
|
||||
"Manage Ollama Models": "Gestisci modelli Ollama",
|
||||
"Manage Pipelines": "Gestire le pipeline",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Il modello '{{modelName}}' è stato scaricato con successo.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Il modello '{{modelTag}}' è già in coda per il download.",
|
||||
"Model {{modelId}} not found": "Modello {{modelId}} non trovato",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Assegna un nome al tuo modello",
|
||||
"New Chat": "Nuova chat",
|
||||
"New Password": "Nuova password",
|
||||
"No documents found": "",
|
||||
"No results found": "Nessun risultato trovato",
|
||||
"No search query generated": "Nessuna query di ricerca generata",
|
||||
"No source available": "Nessuna fonte disponibile",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "API Ollama disabilitata",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Versione Ollama",
|
||||
"On": "Attivato",
|
||||
"Only": "Solo",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "Documento PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
|
||||
"pending": "in sospeso",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Autorizzazione negata durante l'accesso al microfono: {{error}}",
|
||||
"Personalization": "Personalizzazione",
|
||||
"Pipelines": "Condutture",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Leggi ad alta voce",
|
||||
"Record voice": "Registra voce",
|
||||
"Redirecting you to OpenWebUI Community": "Reindirizzamento alla comunità OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Rifiutato quando non avrebbe dovuto",
|
||||
"Regenerate": "Rigenera",
|
||||
"Release Notes": "Note di rilascio",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Salva",
|
||||
"Save & Create": "Salva e crea",
|
||||
"Save & Update": "Salva e aggiorna",
|
||||
@@ -399,35 +427,41 @@
|
||||
"Search Documents": "Cerca documenti",
|
||||
"Search Models": "Cerca modelli",
|
||||
"Search Prompts": "Cerca prompt",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Conteggio dei risultati della ricerca",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Ricercato {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Ricercato {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Ricercato {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Ricerca sul web di '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng Query URL",
|
||||
"See readme.md for instructions": "Vedi readme.md per le istruzioni",
|
||||
"See what's new": "Guarda le novità",
|
||||
"Seed": "Seme",
|
||||
"Select a base model": "Selezionare un modello di base",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Seleziona una modalità",
|
||||
"Select a model": "Seleziona un modello",
|
||||
"Select a pipeline": "Selezionare una tubazione",
|
||||
"Select a pipeline url": "Selezionare l'URL di una pipeline",
|
||||
"Select an Ollama instance": "Seleziona un'istanza Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Seleziona modello",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "I modelli selezionati non supportano l'input di immagini",
|
||||
"Send": "Invia",
|
||||
"Send a Message": "Invia un messaggio",
|
||||
"Send message": "Invia messaggio",
|
||||
"September": "Settembre",
|
||||
"Serper API Key": "Chiave API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Chiave API Serpstack",
|
||||
"Server connection verified": "Connessione al server verificata",
|
||||
"Set as default": "Imposta come predefinito",
|
||||
"Set Default Model": "Imposta modello predefinito",
|
||||
"Set embedding model (e.g. {{model}})": "Imposta modello di embedding (ad esempio {{model}})",
|
||||
"Set Image Size": "Imposta dimensione immagine",
|
||||
"Set Model": "Imposta modello",
|
||||
"Set reranking model (e.g. {{model}})": "Imposta modello di riclassificazione (ad esempio {{model}})",
|
||||
"Set Steps": "Imposta passaggi",
|
||||
"Set Task Model": "Imposta modello di attività",
|
||||
@@ -451,8 +485,8 @@
|
||||
"Source": "Fonte",
|
||||
"Speech recognition error: {{error}}": "Errore di riconoscimento vocale: {{error}}",
|
||||
"Speech-to-Text Engine": "Motore da voce a testo",
|
||||
"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition non è supportata in questo browser.",
|
||||
"Stop Sequence": "Sequenza di arresto",
|
||||
"STT Model": "",
|
||||
"STT Settings": "Impostazioni STT",
|
||||
"Submit": "Invia",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Sottotitolo (ad esempio sull'Impero Romano)",
|
||||
@@ -462,6 +496,7 @@
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Prompt di sistema",
|
||||
"Tags": "Tag",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Raccontaci di più:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Modello",
|
||||
@@ -471,7 +506,9 @@
|
||||
"Thanks for your feedback!": "Grazie per il tuo feedback!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Il punteggio dovrebbe essere un valore compreso tra 0.0 (0%) e 1.0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ciò garantisce che le tue preziose conversazioni siano salvate in modo sicuro nel tuo database backend. Grazie!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Questa impostazione non si sincronizza tra browser o dispositivi.",
|
||||
"Thorough explanation": "Spiegazione dettagliata",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Suggerimento: aggiorna più slot di variabili consecutivamente premendo il tasto tab nell'input della chat dopo ogni sostituzione.",
|
||||
@@ -483,22 +520,31 @@
|
||||
"to": "a",
|
||||
"To access the available model names for downloading,": "Per accedere ai nomi dei modelli disponibili per il download,",
|
||||
"To access the GGUF models available for downloading,": "Per accedere ai modelli GGUF disponibili per il download,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "all'input della chat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Oggi",
|
||||
"Toggle settings": "Attiva/disattiva impostazioni",
|
||||
"Toggle sidebar": "Attiva/disattiva barra laterale",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemi di accesso a Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "Impostazioni TTS",
|
||||
"TTS Voice": "",
|
||||
"Type": "Digitare",
|
||||
"Type Hugging Face Resolve (Download) URL": "Digita l'URL di Hugging Face Resolve (Download)",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Si è verificato un problema durante la connessione a {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo di file sconosciuto '{{file_type}}', ma accettato e trattato come testo normale",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Aggiorna e copia link",
|
||||
"Update password": "Aggiorna password",
|
||||
"Upload a GGUF model": "Carica un modello GGUF",
|
||||
"Upload Files": "Carica file",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Avanzamento caricamento",
|
||||
"URL Mode": "Modalità URL",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Usa '#' nell'input del prompt per caricare e selezionare i tuoi documenti.",
|
||||
@@ -517,6 +563,7 @@
|
||||
"Warning": "Avvertimento",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Attenzione: se aggiorni o cambi il tuo modello di embedding, dovrai reimportare tutti i documenti.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Impostazioni del caricatore Web",
|
||||
"Web Params": "Parametri Web",
|
||||
"Web Search": "Ricerca sul Web",
|
||||
@@ -527,18 +574,20 @@
|
||||
"WebUI will make requests to": "WebUI effettuerà richieste a",
|
||||
"What’s New in": "Novità in",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando la cronologia è disattivata, le nuove chat su questo browser non verranno visualizzate nella cronologia su nessuno dei tuoi dispositivi.",
|
||||
"Whisper (Local)": "Whisper (locale)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Area di lavoro",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Scrivi un suggerimento per il prompt (ad esempio Chi sei?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Scrivi un riassunto in 50 parole che riassume [argomento o parola chiave].",
|
||||
"Yesterday": "Ieri",
|
||||
"You": "Tu",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "Non è possibile clonare un modello di base",
|
||||
"You have no archived conversations.": "Non hai conversazioni archiviate.",
|
||||
"You have shared this chat": "Hai condiviso questa chat",
|
||||
"You're a helpful assistant.": "Sei un assistente utile.",
|
||||
"You're now logged in.": "Ora hai effettuato l'accesso.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Impostazioni del caricatore Youtube"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "ユーザー",
|
||||
"About": "概要",
|
||||
"Account": "アカウント",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "情報の正確性",
|
||||
"Active Users": "",
|
||||
"Add": "追加",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "ユーザーを追加",
|
||||
"Adjusting these settings will apply changes universally to all users.": "これらの設定を調整すると、すべてのユーザーに普遍的に変更が適用されます。",
|
||||
"admin": "管理者",
|
||||
"Admin": "",
|
||||
"Admin Panel": "管理者パネル",
|
||||
"Admin Settings": "管理者設定",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "詳細パラメーター",
|
||||
"Advanced Params": "高度なパラメータ",
|
||||
"all": "すべて",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "オーディオ",
|
||||
"August": "8月",
|
||||
"Auto-playback response": "応答の自動再生",
|
||||
"Auto-send input after 3 sec.": "3 秒後に自動的に出力を送信",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 ベース URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 ベース URL が必要です。",
|
||||
"available!": "利用可能!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "応答が悪い",
|
||||
"Banners": "バナー",
|
||||
"Base Model (From)": "ベースモデル(From)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "より前",
|
||||
"Being lazy": "怠惰な",
|
||||
"Brave Search API Key": "Brave Search APIキー",
|
||||
"Bypass SSL verification for Websites": "SSL 検証をバイパスする",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "キャンセル",
|
||||
"Capabilities": "資格",
|
||||
"Change Password": "パスワードを変更",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "チャンクパラメーター",
|
||||
"Chunk Size": "チャンクサイズ",
|
||||
"Citation": "引用文",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "ヘルプについてはここをクリックしてください。",
|
||||
"Click here to": "ここをクリックして",
|
||||
"Click here to select": "選択するにはここをクリックしてください",
|
||||
"Click here to select a csv file.": "CSVファイルを選択するにはここをクリックしてください。",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "ドキュメントを選択するにはここをクリックしてください。",
|
||||
"click here.": "ここをクリックしてください。",
|
||||
"Click on the user role button to change a user's role.": "ユーザーの役割を変更するには、ユーザー役割ボタンをクリックしてください。",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "コンカレント要求",
|
||||
"Confirm Password": "パスワードを確認",
|
||||
"Connections": "接続",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "コンテンツ",
|
||||
"Context Length": "コンテキストの長さ",
|
||||
"Continue Response": "続きの応答",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "会話モード",
|
||||
"Copied shared chat URL to clipboard!": "共有チャットURLをクリップボードにコピーしました!",
|
||||
"Copy": "コピー",
|
||||
"Copy last code block": "最後のコードブロックをコピー",
|
||||
"Copy last response": "最後の応答をコピー",
|
||||
"Copy Link": "リンクをコピー",
|
||||
"Copying to clipboard was successful!": "クリップボードへのコピーが成功しました!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "次のクエリの見出しとして、3〜5語の簡潔なフレーズを作成してください。3〜5語の制限を厳守し、「タイトル」という単語の使用を避けてください。",
|
||||
"Create a model": "モデルを作成する",
|
||||
"Create Account": "アカウントを作成",
|
||||
"Create new key": "新しいキーを作成",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "カスタム",
|
||||
"Customize models for a specific purpose": "特定の目的に合わせてモデルをカスタマイズする",
|
||||
"Dark": "ダーク",
|
||||
"Dashboard": "",
|
||||
"Database": "データベース",
|
||||
"December": "12月",
|
||||
"Default": "デフォルト",
|
||||
"Default (Automatic1111)": "デフォルト (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "デフォルト (SentenceTransformers)",
|
||||
"Default (Web API)": "デフォルト (Web API)",
|
||||
"Default Model": "デフォルトモデル",
|
||||
"Default model updated": "デフォルトモデルが更新されました",
|
||||
"Default Prompt Suggestions": "デフォルトのプロンプトの提案",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "プロンプトを見つける",
|
||||
"Discover, download, and explore custom prompts": "カスタムプロンプトを見つけて、ダウンロードして、探索",
|
||||
"Discover, download, and explore model presets": "モデルプリセットを見つけて、ダウンロードして、探索",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "チャットで「あなた」の代わりにユーザー名を表示",
|
||||
"Document": "ドキュメント",
|
||||
"Document Settings": "ドキュメント設定",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例: '30秒'、'10分'。有効な時間単位は '秒'、'分'、'時間' です。",
|
||||
"Edit": "編集",
|
||||
"Edit Doc": "ドキュメントを編集",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "ユーザーを編集",
|
||||
"Email": "メールアドレス",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "スコアを入力してください",
|
||||
"Enter Searxng Query URL": "SearxngクエリURLを入力",
|
||||
"Enter Serper API Key": "Serper APIキーの入力",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack APIキーの入力",
|
||||
"Enter stop sequence": "ストップシーケンスを入力してください",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "トップ K を入力してください",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "URL を入力してください (例: http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "URL を入力してください (例: http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "ドキュメントマッピングをエクスポート",
|
||||
"Export Models": "モデルのエクスポート",
|
||||
"Export Prompts": "プロンプトをエクスポート",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "APIキーの作成に失敗しました。",
|
||||
"Failed to read clipboard contents": "クリップボードの内容を読み取れませんでした",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "周波数ペナルティ",
|
||||
"General": "一般",
|
||||
"General Settings": "一般設定",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "検索クエリの生成",
|
||||
"Generation Info": "生成情報",
|
||||
"Good Response": "良い応答",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "ドキュメントマッピングをインポート",
|
||||
"Import Models": "モデルのインポート",
|
||||
"Import Prompts": "プロンプトをインポート",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webuiを実行する際に`--api`フラグを含める",
|
||||
"Info": "情報",
|
||||
"Input commands": "入力コマンド",
|
||||
"Install from Github URL": "Github URLからインストール",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "インターフェース",
|
||||
"Invalid Tag": "無効なタグ",
|
||||
"January": "1月",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT トークン",
|
||||
"Keep Alive": "キープアライブ",
|
||||
"Keyboard shortcuts": "キーボードショートカット",
|
||||
"Knowledge": "",
|
||||
"Language": "言語",
|
||||
"Last Active": "最終アクティブ",
|
||||
"Last Modified": "",
|
||||
"Light": "ライト",
|
||||
"Listening...": "聞いています...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLM は間違いを犯す可能性があります。重要な情報を検証してください。",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "OpenWebUI コミュニティによって作成",
|
||||
"Make sure to enclose them with": "必ず次で囲んでください",
|
||||
"Manage": "",
|
||||
"Manage Models": "モデルを管理",
|
||||
"Manage Ollama Models": "Ollama モデルを管理",
|
||||
"Manage Pipelines": "パイプラインの管理",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "ミロスタット Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "モデル '{{modelName}}' が正常にダウンロードされました。",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "モデル '{{modelTag}}' はすでにダウンロード待ち行列に入っています。",
|
||||
"Model {{modelId}} not found": "モデル {{modelId}} が見つかりません",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "モデルに名前を付ける",
|
||||
"New Chat": "新しいチャット",
|
||||
"New Password": "新しいパスワード",
|
||||
"No documents found": "",
|
||||
"No results found": "結果が見つかりません",
|
||||
"No search query generated": "検索クエリは生成されません",
|
||||
"No source available": "使用可能なソースがありません",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API が無効になっています",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama バージョン",
|
||||
"On": "オン",
|
||||
"Only": "のみ",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF ドキュメント (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
|
||||
"pending": "保留中",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "マイクへのアクセス時に権限が拒否されました: {{error}}",
|
||||
"Personalization": "個人化",
|
||||
"Pipelines": "パイプライン",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "読み上げ",
|
||||
"Record voice": "音声を録音",
|
||||
"Redirecting you to OpenWebUI Community": "OpenWebUI コミュニティにリダイレクトしています",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "許可されないのに許可されました",
|
||||
"Regenerate": "再生成",
|
||||
"Release Notes": "リリースノート",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "保存",
|
||||
"Save & Create": "保存して作成",
|
||||
"Save & Update": "保存して更新",
|
||||
@@ -399,33 +427,39 @@
|
||||
"Search Documents": "ドキュメントを検索",
|
||||
"Search Models": "モデル検索",
|
||||
"Search Prompts": "プロンプトを検索",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "検索結果数",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_other": "{{count}} sites_other検索",
|
||||
"Searching the web for '{{searchQuery}}'": "ウェブで '{{searchQuery}}' を検索する",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng クエリ URL",
|
||||
"See readme.md for instructions": "手順については readme.md を参照してください",
|
||||
"See what's new": "新機能を見る",
|
||||
"Seed": "シード",
|
||||
"Select a base model": "基本モデルの選択",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "モードを選択",
|
||||
"Select a model": "モデルを選択",
|
||||
"Select a pipeline": "パイプラインの選択",
|
||||
"Select a pipeline url": "パイプラインの URL を選択する",
|
||||
"Select an Ollama instance": "Ollama インスタンスを選択",
|
||||
"Select Documents": "",
|
||||
"Select model": "モデルを選択",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "一部のモデルは画像入力をサポートしていません",
|
||||
"Send": "送信",
|
||||
"Send a Message": "メッセージを送信",
|
||||
"Send message": "メッセージを送信",
|
||||
"September": "9月",
|
||||
"Serper API Key": "Serper APIキー",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack APIキー",
|
||||
"Server connection verified": "サーバー接続が確認されました",
|
||||
"Set as default": "デフォルトに設定",
|
||||
"Set Default Model": "デフォルトモデルを設定",
|
||||
"Set embedding model (e.g. {{model}})": "埋め込みモデルを設定します(例:{{model}})",
|
||||
"Set Image Size": "画像サイズを設定",
|
||||
"Set Model": "モデルを設定",
|
||||
"Set reranking model (e.g. {{model}})": "モデルを設定します(例:{{model}})",
|
||||
"Set Steps": "ステップを設定",
|
||||
"Set Task Model": "タスクモデルの設定",
|
||||
@@ -449,8 +483,8 @@
|
||||
"Source": "ソース",
|
||||
"Speech recognition error: {{error}}": "音声認識エラー: {{error}}",
|
||||
"Speech-to-Text Engine": "音声テキスト変換エンジン",
|
||||
"SpeechRecognition API is not supported in this browser.": "このブラウザでは SpeechRecognition API がサポートされていません。",
|
||||
"Stop Sequence": "ストップシーケンス",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT 設定",
|
||||
"Submit": "送信",
|
||||
"Subtitle (e.g. about the Roman Empire)": "タイトル (例: ロマ帝国)",
|
||||
@@ -460,6 +494,7 @@
|
||||
"System": "システム",
|
||||
"System Prompt": "システムプロンプト",
|
||||
"Tags": "タグ",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "もっと話してください:",
|
||||
"Temperature": "温度",
|
||||
"Template": "テンプレート",
|
||||
@@ -469,7 +504,9 @@
|
||||
"Thanks for your feedback!": "ご意見ありがとうございます!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "スコアは0.0(0%)から1.0(100%)の間の値にしてください。",
|
||||
"Theme": "テーマ",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "これは、貴重な会話がバックエンドデータベースに安全に保存されることを保証します。ありがとうございます!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "この設定は、ブラウザやデバイス間で同期されません。",
|
||||
"Thorough explanation": "詳細な説明",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "ヒント: 各置換後にチャット入力で Tab キーを押すことで、複数の変数スロットを連続して更新できます。",
|
||||
@@ -481,22 +518,31 @@
|
||||
"to": "まで",
|
||||
"To access the available model names for downloading,": "ダウンロード可能なモデル名にアクセスするには、",
|
||||
"To access the GGUF models available for downloading,": "ダウンロード可能な GGUF モデルにアクセスするには、",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "チャット入力へ。",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "今日",
|
||||
"Toggle settings": "設定を切り替え",
|
||||
"Toggle sidebar": "サイドバーを切り替え",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "トップ K",
|
||||
"Top P": "トップ P",
|
||||
"Trouble accessing Ollama?": "Ollama へのアクセスに問題がありますか?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS 設定",
|
||||
"TTS Voice": "",
|
||||
"Type": "種類",
|
||||
"Type Hugging Face Resolve (Download) URL": "Hugging Face Resolve (ダウンロード) URL を入力してください",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "おっと! {{provider}} への接続に問題が発生しました。",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "不明なファイルタイプ '{{file_type}}' ですが、プレーンテキストとして受け入れて処理します",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "リンクの更新とコピー",
|
||||
"Update password": "パスワードを更新",
|
||||
"Upload a GGUF model": "GGUF モデルをアップロード",
|
||||
"Upload Files": "ファイルのアップロード",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "アップロードの進行状況",
|
||||
"URL Mode": "URL モード",
|
||||
"Use '#' in the prompt input to load and select your documents.": "プロンプト入力で '#' を使用して、ドキュメントを読み込んで選択します。",
|
||||
@@ -515,6 +561,7 @@
|
||||
"Warning": "警告",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告: 埋め込みモデルを更新または変更した場合は、すべてのドキュメントを再インポートする必要があります。",
|
||||
"Web": "ウェブ",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web 読み込み設定",
|
||||
"Web Params": "Web パラメータ",
|
||||
"Web Search": "ウェブ検索",
|
||||
@@ -525,18 +572,20 @@
|
||||
"WebUI will make requests to": "WebUI は次に対してリクエストを行います",
|
||||
"What’s New in": "新機能",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "履歴が無効になっている場合、このブラウザでの新しいチャットは、どのデバイスの履歴にも表示されません。",
|
||||
"Whisper (Local)": "Whisper (ローカル)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "ワークスペース",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "プロンプトの提案を書いてください (例: あなたは誰ですか?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "[トピックまたはキーワード] を要約する 50 語の概要を書いてください。",
|
||||
"Yesterday": "昨日",
|
||||
"You": "あなた",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "基本モデルのクローンを作成できない",
|
||||
"You have no archived conversations.": "これまでにアーカイブされた会話はありません。",
|
||||
"You have shared this chat": "このチャットを共有しました",
|
||||
"You're a helpful assistant.": "あなたは役に立つアシスタントです。",
|
||||
"You're now logged in.": "ログインしました。",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "Youtubeローダー設定"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "მომხმარებელი",
|
||||
"About": "შესახებ",
|
||||
"Account": "ანგარიში",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "დიდი ინფორმაცია",
|
||||
"Active Users": "",
|
||||
"Add": "დამატება",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "მომხმარებლის დამატება",
|
||||
"Adjusting these settings will apply changes universally to all users.": "ამ პარამეტრების რეგულირება ცვლილებებს უნივერსალურად გამოიყენებს ყველა მომხმარებლისთვის",
|
||||
"admin": "ადმინისტრატორი",
|
||||
"Admin": "",
|
||||
"Admin Panel": "ადმინ პანელი",
|
||||
"Admin Settings": "ადმინისტრატორის ხელსაწყოები",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "დამატებითი პარამეტრები",
|
||||
"Advanced Params": "მოწინავე პარამები",
|
||||
"all": "ყველა",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "ხმოვანი",
|
||||
"August": "აგვისტო",
|
||||
"Auto-playback response": "ავტომატური დაკვრის პასუხი",
|
||||
"Auto-send input after 3 sec.": "შეყვანის ავტომატური გაგზავნა 3 წამის შემდეგ ",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 საბაზისო მისამართი",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 საბაზისო მისამართი აუცილებელია",
|
||||
"available!": "ხელმისაწვდომია!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "ხარვეზი",
|
||||
"Banners": "რეკლამა",
|
||||
"Base Model (From)": "საბაზო მოდელი (-დან)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "ადგილზე",
|
||||
"Being lazy": "ჩაიტყვევა",
|
||||
"Brave Search API Key": "Brave Search API გასაღები",
|
||||
"Bypass SSL verification for Websites": "SSL-ის ვერიფიკაციის გააუქმება ვებსაიტებზე",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "გაუქმება",
|
||||
"Capabilities": "შესაძლებლობები",
|
||||
"Change Password": "პაროლის შეცვლა",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "გადახურვის პარამეტრები",
|
||||
"Chunk Size": "გადახურვის ზომა",
|
||||
"Citation": "ციტატა",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "დახმარებისთვის, დააკლიკე აქ",
|
||||
"Click here to": "დააკლიკე აქ",
|
||||
"Click here to select": "ასარჩევად, დააკლიკე აქ",
|
||||
"Click here to select a csv file.": "ასარჩევად, დააკლიკე აქ",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "დოკუმენტების ასარჩევად, დააკლიკე აქ",
|
||||
"click here.": "დააკლიკე აქ",
|
||||
"Click on the user role button to change a user's role.": "დააკლიკეთ მომხმარებლის როლის ღილაკს რომ შეცვალოთ მომხმარების როლი",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "თანმხლები მოთხოვნები",
|
||||
"Confirm Password": "პაროლის დამოწმება",
|
||||
"Connections": "კავშირები",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "კონტენტი",
|
||||
"Context Length": "კონტექსტის სიგრძე",
|
||||
"Continue Response": "პასუხის გაგრძელება",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "საუბრი რეჟიმი",
|
||||
"Copied shared chat URL to clipboard!": "ყავს ჩათის URL-ი კლიპბორდში!",
|
||||
"Copy": "კოპირება",
|
||||
"Copy last code block": "ბოლო ბლოკის კოპირება",
|
||||
"Copy last response": "ბოლო პასუხის კოპირება",
|
||||
"Copy Link": "კოპირება",
|
||||
"Copying to clipboard was successful!": "კლავიატურაზე კოპირება წარმატებით დასრულდა",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "შექმენით მოკლე, 3-5 სიტყვიანი ფრაზა, როგორც სათაური თქვენი შემდეგი შეკითხვისთვის, მკაცრად დაიცავით 3-5 სიტყვის ლიმიტი და მოერიდეთ გამოიყენოთ სიტყვა „სათაური“.",
|
||||
"Create a model": "შექმენით მოდელი",
|
||||
"Create Account": "ანგარიშის შექმნა",
|
||||
"Create new key": "პირადი ღირებულბრის შექმნა",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "საკუთარი",
|
||||
"Customize models for a specific purpose": "მოდელების მორგება კონკრეტული მიზნისთვის",
|
||||
"Dark": "მუქი",
|
||||
"Dashboard": "",
|
||||
"Database": "მონაცემთა ბაზა",
|
||||
"December": "დეკემბერი",
|
||||
"Default": "დეფოლტი",
|
||||
"Default (Automatic1111)": "დეფოლტ (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "დეფოლტ (SentenceTransformers)",
|
||||
"Default (Web API)": "დეფოლტ (Web API)",
|
||||
"Default Model": "ნაგულისხმები მოდელი",
|
||||
"Default model updated": "დეფოლტ მოდელი განახლებულია",
|
||||
"Default Prompt Suggestions": "დეფოლტ პრომპტი პირველი პირველი",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "აღმოაჩინეთ მოთხოვნა",
|
||||
"Discover, download, and explore custom prompts": "აღმოაჩინეთ, ჩამოტვირთეთ და შეისწავლეთ მორგებული მოთხოვნები",
|
||||
"Discover, download, and explore model presets": "აღმოაჩინეთ, ჩამოტვირთეთ და შეისწავლეთ მოდელის წინასწარ პარამეტრები",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "ჩატში აჩვენე მომხმარებლის სახელი თქვენს ნაცვლად",
|
||||
"Document": "დოკუმენტი",
|
||||
"Document Settings": "დოკუმენტის პარამეტრები",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "მაგალითად, '30წ', '10მ'. მოქმედი დროის ერთეულები: 'წ', 'წთ', 'სთ'.",
|
||||
"Edit": "რედაქტირება",
|
||||
"Edit Doc": "დოკუმენტის ედიტირება",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "მომხმარებლის ედიტირება",
|
||||
"Email": "ელ-ფოსტა",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "შეიყვანეთ ქულა",
|
||||
"Enter Searxng Query URL": "შეიყვანეთ Searxng Query URL",
|
||||
"Enter Serper API Key": "შეიყვანეთ Serper API Key",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "შეიყვანეთ Serpstack API Key",
|
||||
"Enter stop sequence": "შეიყვანეთ ტოპ თანმიმდევრობა",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "შეიყვანეთ Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "შეიყვანეთ მისამართი (მაგალითად http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "შეიყვანეთ მისამართი (მაგალითად http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "დოკუმენტების კავშირის ექსპორტი",
|
||||
"Export Models": "ექსპორტის მოდელები",
|
||||
"Export Prompts": "მოთხოვნების ექსპორტი",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API ღილაკის შექმნა ვერ მოხერხდა.",
|
||||
"Failed to read clipboard contents": "ბუფერში შიგთავსის წაკითხვა ვერ მოხერხდა",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "სიხშირის ჯარიმა",
|
||||
"General": "ზოგადი",
|
||||
"General Settings": "ზოგადი პარამეტრები",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "საძიებო მოთხოვნის გენერირება",
|
||||
"Generation Info": "გენერაციის ინფორმაცია",
|
||||
"Good Response": "დიდი პასუხი",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "დოკუმენტების კავშირის იმპორტი",
|
||||
"Import Models": "იმპორტის მოდელები",
|
||||
"Import Prompts": "მოთხოვნების იმპორტი",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "ჩართეთ `--api` დროშა stable-diffusion-webui-ის გაშვებისას",
|
||||
"Info": "ინფორმაცია",
|
||||
"Input commands": "შეყვანით ბრძანებებს",
|
||||
"Install from Github URL": "დააინსტალირეთ Github URL- დან",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "ინტერფეისი",
|
||||
"Invalid Tag": "არასწორი ტეგი",
|
||||
"January": "იანვარი",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT ტოკენი",
|
||||
"Keep Alive": "აქტიურად დატოვება",
|
||||
"Keyboard shortcuts": "კლავიატურის მალსახმობები",
|
||||
"Knowledge": "",
|
||||
"Language": "ენა",
|
||||
"Last Active": "ბოლო აქტიური",
|
||||
"Last Modified": "",
|
||||
"Light": "მსუბუქი",
|
||||
"Listening...": "გისმენ...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "შესაძლოა LLM-ებმა შეცდომები დაუშვან. გადაამოწმეთ მნიშვნელოვანი ინფორმაცია.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "დამზადებულია OpenWebUI საზოგადოების მიერ",
|
||||
"Make sure to enclose them with": "დარწმუნდით, რომ დაურთეთ ისინი",
|
||||
"Manage": "",
|
||||
"Manage Models": "მოდელების მართვა",
|
||||
"Manage Ollama Models": "Ollama მოდელების მართვა",
|
||||
"Manage Pipelines": "მილსადენების მართვა",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "მიროსტატი ტაუ",
|
||||
"MMMM DD, YYYY": "თვე დღე, წელი",
|
||||
"MMMM DD, YYYY HH:mm": "თვე დღე, წელი HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "მოდელი „{{modelName}}“ წარმატებით ჩამოიტვირთა.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "მოდელი „{{modelTag}}“ უკვე ჩამოტვირთვის რიგშია.",
|
||||
"Model {{modelId}} not found": "მოდელი {{modelId}} ვერ მოიძებნა",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "დაასახელეთ თქვენი მოდელი",
|
||||
"New Chat": "ახალი მიმოწერა",
|
||||
"New Password": "ახალი პაროლი",
|
||||
"No documents found": "",
|
||||
"No results found": "ჩვენ ვერ პოულობით ნაპოვნი ჩაწერები",
|
||||
"No search query generated": "ძიების მოთხოვნა არ არის გენერირებული",
|
||||
"No source available": "წყარო არ არის ხელმისაწვდომი",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API გამორთულია",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama ვერსია",
|
||||
"On": "ჩართვა",
|
||||
"Only": "მხოლოდ",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF დოკუმენტი (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)",
|
||||
"pending": "ლოდინის რეჟიმშია",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "ნებართვა უარყოფილია მიკროფონზე წვდომისას: {{error}}",
|
||||
"Personalization": "პერსონალიზაცია",
|
||||
"Pipelines": "მილსადენები",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "ხმის ჩაწერა",
|
||||
"Record voice": "ხმის ჩაწერა",
|
||||
"Redirecting you to OpenWebUI Community": "გადამისამართდებით OpenWebUI საზოგადოებაში",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "უარა, როგორც უნდა იყოს",
|
||||
"Regenerate": "ხელახლა გენერირება",
|
||||
"Release Notes": "Გამოშვების შენიშვნები",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "ვარდისფერი ფიჭვის ხე",
|
||||
"Rosé Pine Dawn": "ვარდისფერი ფიჭვის გარიჟრაჟი",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "შენახვა",
|
||||
"Save & Create": "დამახსოვრება და შექმნა",
|
||||
"Save & Update": "დამახსოვრება და განახლება",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "დოკუმენტების ძიება",
|
||||
"Search Models": "საძიებო მოდელები",
|
||||
"Search Prompts": "მოთხოვნების ძიება",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "ძიების შედეგების რაოდენობა",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Searched {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Searched {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "ეძებს ვებ '{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng Query URL",
|
||||
"See readme.md for instructions": "იხილეთ readme.md ინსტრუქციებისთვის",
|
||||
"See what's new": "სიახლეების ნახვა",
|
||||
"Seed": "სიდი",
|
||||
"Select a base model": "აირჩიეთ ბაზის მოდელი",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "რეჟიმის არჩევა",
|
||||
"Select a model": "მოდელის არჩევა",
|
||||
"Select a pipeline": "აირჩიეთ მილსადენი",
|
||||
"Select a pipeline url": "აირჩიეთ მილსადენის url",
|
||||
"Select an Ollama instance": "Ollama ინსტანსის არჩევა",
|
||||
"Select Documents": "",
|
||||
"Select model": "მოდელის არჩევა",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "შერჩეული მოდელი (ებ) ი არ უჭერს მხარს გამოსახულების შეყვანას",
|
||||
"Send": "გაგზავნა",
|
||||
"Send a Message": "შეტყობინების გაგზავნა",
|
||||
"Send message": "შეტყობინების გაგზავნა",
|
||||
"September": "სექტემბერი",
|
||||
"Serper API Key": "Serper API Key",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API Key",
|
||||
"Server connection verified": "სერვერთან კავშირი დადასტურებულია",
|
||||
"Set as default": "დეფოლტად დაყენება",
|
||||
"Set Default Model": "დეფოლტ მოდელის დაყენება",
|
||||
"Set embedding model (e.g. {{model}})": "ჩვენება მოდელის დაყენება (მაგ. {{model}})",
|
||||
"Set Image Size": "სურათის ზომის დაყენება",
|
||||
"Set Model": "მოდელის დაყენება",
|
||||
"Set reranking model (e.g. {{model}})": "რეტარირება მოდელის დაყენება (მაგ. {{model}})",
|
||||
"Set Steps": "ნაბიჯების დაყენება",
|
||||
"Set Task Model": "დააყენეთ სამუშაო მოდელი",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "წყარო",
|
||||
"Speech recognition error: {{error}}": "მეტყველების ამოცნობის შეცდომა: {{error}}",
|
||||
"Speech-to-Text Engine": "ხმოვან-ტექსტური ძრავი",
|
||||
"SpeechRecognition API is not supported in this browser.": "მეტყველების ამოცნობის API არ არის მხარდაჭერილი ამ ბრაუზერში.",
|
||||
"Stop Sequence": "შეჩერების თანმიმდევრობა",
|
||||
"STT Model": "",
|
||||
"STT Settings": "მეტყველების ამოცნობის პარამეტრები",
|
||||
"Submit": "გაგზავნა",
|
||||
"Subtitle (e.g. about the Roman Empire)": "სუბტიტრები (მაგ. რომის იმპერიის შესახებ)",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "სისტემა",
|
||||
"System Prompt": "სისტემური მოთხოვნა",
|
||||
"Tags": "ტეგები",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "ჩვენთან დავუკავშირდით",
|
||||
"Temperature": "ტემპერატურა",
|
||||
"Template": "შაბლონი",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "მადლობა გამოხმაურებისთვის!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "ქულა 0.0 (0%) და 1.0 (100%) ჩაშენებული უნდა იყოს.",
|
||||
"Theme": "თემა",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "ეს უზრუნველყოფს, რომ თქვენი ძვირფასი საუბრები უსაფრთხოდ შეინახება თქვენს backend მონაცემთა ბაზაში. Გმადლობთ!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "ეს პარამეტრი არ სინქრონიზდება ბრაუზერებსა და მოწყობილობებში",
|
||||
"Thorough explanation": "ვრცლად აღწერა",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "რჩევა: განაახლეთ რამდენიმე ცვლადი სლოტი თანმიმდევრულად, ყოველი ჩანაცვლების შემდეგ ჩატის ღილაკზე დაჭერით.",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "ში",
|
||||
"To access the available model names for downloading,": "ჩამოტვირთვისთვის ხელმისაწვდომი მოდელების სახელებზე წვდომისთვის",
|
||||
"To access the GGUF models available for downloading,": "ჩასატვირთად ხელმისაწვდომი GGUF მოდელებზე წვდომისთვის",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "ჩატში",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "დღეს",
|
||||
"Toggle settings": "პარამეტრების გადართვა",
|
||||
"Toggle sidebar": "გვერდითი ზოლის გადართვა",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "ტოპ K",
|
||||
"Top P": "ტოპ P",
|
||||
"Trouble accessing Ollama?": "Ollama-ს ვერ უკავშირდები?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS პარამეტრები",
|
||||
"TTS Voice": "",
|
||||
"Type": "ტიპი",
|
||||
"Type Hugging Face Resolve (Download) URL": "სცადე გადმოწერო Hugging Face Resolve URL",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "{{provider}}-თან დაკავშირების პრობლემა წარმოიშვა.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "უცნობი ფაილის ტიპი „{{file_type}}“, მაგრამ მიიღება და განიხილება როგორც მარტივი ტექსტი",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "განახლება და ბმულის კოპირება",
|
||||
"Update password": "პაროლის განახლება",
|
||||
"Upload a GGUF model": "GGUF მოდელის ატვირთვა",
|
||||
"Upload Files": "ატვირთეთ ფაილები",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "პროგრესის ატვირთვა",
|
||||
"URL Mode": "URL რეჟიმი",
|
||||
"Use '#' in the prompt input to load and select your documents.": "პრომტში გამოიყენე '#' რომელიც გაიტანს დოკუმენტებს",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "გაფრთხილება",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "გაფრთხილება: თუ განაახლებთ ან შეცვლით ჩანერგვის მოდელს, მოგიწევთ ყველა დოკუმენტის ხელახლა იმპორტი.",
|
||||
"Web": "ვები",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "ვების ჩატარების პარამეტრები",
|
||||
"Web Params": "ვების პარამეტრები",
|
||||
"Web Search": "ვებ ძებნა",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "WebUI გამოგიგზავნით მოთხოვნებს",
|
||||
"What’s New in": "რა არის ახალი",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "როდესაც ისტორია გამორთულია, ახალი ჩეთები ამ ბრაუზერში არ გამოჩნდება თქვენს ისტორიაში არცერთ მოწყობილობაზე.",
|
||||
"Whisper (Local)": "ჩურჩული (ადგილობრივი)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "ვულერი",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "დაწერეთ მოკლე წინადადება (მაგ. ვინ ხარ?",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "დაწერეთ რეზიუმე 50 სიტყვით, რომელიც აჯამებს [თემას ან საკვანძო სიტყვას].",
|
||||
"Yesterday": "აღდგენა",
|
||||
"You": "ჩემი",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "თქვენ არ შეგიძლიათ ბაზის მოდელის კლონირება",
|
||||
"You have no archived conversations.": "არ ხართ არქივირებული განხილვები.",
|
||||
"You have shared this chat": "ამ ჩატის გააგზავნა",
|
||||
"You're a helpful assistant.": "თქვენ სასარგებლო ასისტენტი ხართ.",
|
||||
"You're now logged in.": "თქვენ შესული ხართ.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube Loader Settings"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "사용자",
|
||||
"About": "소개",
|
||||
"Account": "계정",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "정확한 정보",
|
||||
"Active Users": "",
|
||||
"Add": "추가",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "사용자 추가",
|
||||
"Adjusting these settings will apply changes universally to all users.": "이 설정을 조정하면 모든 사용자에게 적용됩니다.",
|
||||
"admin": "관리자",
|
||||
"Admin": "",
|
||||
"Admin Panel": "관리자 패널",
|
||||
"Admin Settings": "관리자 설정",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "고급 매개변수",
|
||||
"Advanced Params": "고급 매개 변수",
|
||||
"all": "모두",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "오디오",
|
||||
"August": "8월",
|
||||
"Auto-playback response": "응답 자동 재생",
|
||||
"Auto-send input after 3 sec.": "3초 후 입력 자동 전송",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Base URL이 필요합니다.",
|
||||
"available!": "사용 가능!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "응답이 좋지 않습니다.",
|
||||
"Banners": "배너",
|
||||
"Base Model (From)": "기본 모델(시작)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "이전",
|
||||
"Being lazy": "게으름 피우기",
|
||||
"Brave Search API Key": "Brave Search API 키",
|
||||
"Bypass SSL verification for Websites": "SSL 검증을 무시하려면 웹 사이트를 선택하세요.",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "취소",
|
||||
"Capabilities": "기능",
|
||||
"Change Password": "비밀번호 변경",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Chunk Params",
|
||||
"Chunk Size": "Chunk Size",
|
||||
"Citation": "인용",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "도움말을 보려면 여기를 클릭하세요.",
|
||||
"Click here to": "여기를 클릭하면",
|
||||
"Click here to select": "선택하려면 여기를 클릭하세요.",
|
||||
"Click here to select a csv file.": "csv 파일을 선택하려면 여기를 클릭하세요.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "문서를 선택하려면 여기를 클릭하세요.",
|
||||
"click here.": "여기를 클릭하세요.",
|
||||
"Click on the user role button to change a user's role.": "사용자 역할 버튼을 클릭하여 사용자의 역할을 변경하세요.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "동시 요청",
|
||||
"Confirm Password": "비밀번호 확인",
|
||||
"Connections": "연결",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "내용",
|
||||
"Context Length": "내용 길이",
|
||||
"Continue Response": "대화 계속",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "대화 모드",
|
||||
"Copied shared chat URL to clipboard!": "공유 채팅 URL이 클립보드에 복사되었습니다!",
|
||||
"Copy": "복사",
|
||||
"Copy last code block": "마지막 코드 블록 복사",
|
||||
"Copy last response": "마지막 응답 복사",
|
||||
"Copy Link": "링크 복사",
|
||||
"Copying to clipboard was successful!": "클립보드에 복사되었습니다!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "다음 질문에 대한 제목으로 간결한 3-5 단어 문구를 만드되 3-5 단어 제한을 엄격히 준수하고 'title' 단어 사용을 피하세요:",
|
||||
"Create a model": "모델 만들기",
|
||||
"Create Account": "계정 만들기",
|
||||
"Create new key": "새 키 만들기",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "사용자 정의",
|
||||
"Customize models for a specific purpose": "특정 목적을 위한 모델 사용자 지정",
|
||||
"Dark": "어두운",
|
||||
"Dashboard": "",
|
||||
"Database": "데이터베이스",
|
||||
"December": "12월",
|
||||
"Default": "기본값",
|
||||
"Default (Automatic1111)": "기본값 (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "기본값 (SentenceTransformers)",
|
||||
"Default (Web API)": "기본값 (Web API)",
|
||||
"Default Model": "기본 모델",
|
||||
"Default model updated": "기본 모델이 업데이트되었습니다.",
|
||||
"Default Prompt Suggestions": "기본 프롬프트 제안",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "프롬프트 검색",
|
||||
"Discover, download, and explore custom prompts": "사용자 정의 프롬프트 검색, 다운로드 및 탐색",
|
||||
"Discover, download, and explore model presets": "모델 사전 설정 검색, 다운로드 및 탐색",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "채팅에서 'You' 대신 사용자 이름 표시",
|
||||
"Document": "문서",
|
||||
"Document Settings": "문서 설정",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "예: '30s','10m'. 유효한 시간 단위는 's', 'm', 'h'입니다.",
|
||||
"Edit": "편집",
|
||||
"Edit Doc": "문서 편집",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "사용자 편집",
|
||||
"Email": "이메일",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "점수 입력",
|
||||
"Enter Searxng Query URL": "Searxng 쿼리 URL 입력",
|
||||
"Enter Serper API Key": "Serper API Key 입력",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack API Key 입력",
|
||||
"Enter stop sequence": "중지 시퀀스 입력",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Top K 입력",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "URL 입력(예: http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "URL 입력(예: http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "문서 매핑 내보내기",
|
||||
"Export Models": "모델 내보내기",
|
||||
"Export Prompts": "프롬프트 내보내기",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API 키 생성에 실패했습니다.",
|
||||
"Failed to read clipboard contents": "클립보드 내용을 읽는 데 실패했습니다.",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "주파수 페널티",
|
||||
"General": "일반",
|
||||
"General Settings": "일반 설정",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "검색 쿼리 생성",
|
||||
"Generation Info": "생성 정보",
|
||||
"Good Response": "좋은 응답",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "문서 매핑 가져오기",
|
||||
"Import Models": "모델 가져오기",
|
||||
"Import Prompts": "프롬프트 가져오기",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui를 실행할 때 '--api' 플래그 포함",
|
||||
"Info": "정보",
|
||||
"Input commands": "입력 명령",
|
||||
"Install from Github URL": "Github URL에서 설치",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "인터페이스",
|
||||
"Invalid Tag": "잘못된 태그",
|
||||
"January": "1월",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT 토큰",
|
||||
"Keep Alive": "계속 유지하기",
|
||||
"Keyboard shortcuts": "키보드 단축키",
|
||||
"Knowledge": "",
|
||||
"Language": "언어",
|
||||
"Last Active": "최근 활동",
|
||||
"Last Modified": "",
|
||||
"Light": "밝음",
|
||||
"Listening...": "청취 중...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLM은 실수를 할 수 있습니다. 중요한 정보를 확인하세요.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "OpenWebUI 커뮤니티에서 제작",
|
||||
"Make sure to enclose them with": "다음으로 묶는 것을 잊지 마세요:",
|
||||
"Manage": "",
|
||||
"Manage Models": "모델 관리",
|
||||
"Manage Ollama Models": "Ollama 모델 관리",
|
||||
"Manage Pipelines": "파이프라인 관리",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "모델 '{{modelName}}'이(가) 성공적으로 다운로드되었습니다.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "모델 '{{modelTag}}'이(가) 이미 다운로드 대기열에 있습니다.",
|
||||
"Model {{modelId}} not found": "모델 {{modelId}}를 찾을 수 없습니다.",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "모델 이름 지정",
|
||||
"New Chat": "새 채팅",
|
||||
"New Password": "새 비밀번호",
|
||||
"No documents found": "",
|
||||
"No results found": "결과 없음",
|
||||
"No search query generated": "검색어가 생성되지 않았습니다.",
|
||||
"No source available": "사용 가능한 소스 없음",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "올라마 API",
|
||||
"Ollama API disabled": "Ollama API 사용 안 함",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama 버전",
|
||||
"On": "켜기",
|
||||
"Only": "오직",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF 문서 (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF에서 이미지 추출 (OCR)",
|
||||
"pending": "보류 중",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "마이크 액세스가 거부되었습니다: {{error}}",
|
||||
"Personalization": "개인화",
|
||||
"Pipelines": "파이프라인",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "읽어주기",
|
||||
"Record voice": "음성 녹음",
|
||||
"Redirecting you to OpenWebUI Community": "OpenWebUI 커뮤니티로 리디렉션하는 중",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "허용되지 않았지만 허용되어야 합니다.",
|
||||
"Regenerate": "재생성",
|
||||
"Release Notes": "릴리스 노트",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "로제 파인",
|
||||
"Rosé Pine Dawn": "로제 파인 던",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "저장",
|
||||
"Save & Create": "저장 및 생성",
|
||||
"Save & Update": "저장 및 업데이트",
|
||||
@@ -399,33 +427,39 @@
|
||||
"Search Documents": "문서 검색",
|
||||
"Search Models": "모델 검색",
|
||||
"Search Prompts": "프롬프트 검색",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "검색 결과 개수",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_other": "{{count}} sites_other 검색됨",
|
||||
"Searching the web for '{{searchQuery}}'": "웹에서 '{{searchQuery}}' 검색",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng 쿼리 URL",
|
||||
"See readme.md for instructions": "설명은 readme.md를 참조하세요.",
|
||||
"See what's new": "새로운 기능 보기",
|
||||
"Seed": "시드",
|
||||
"Select a base model": "기본 모델 선택",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "모드 선택",
|
||||
"Select a model": "모델 선택",
|
||||
"Select a pipeline": "파이프라인 선택",
|
||||
"Select a pipeline url": "파이프라인 URL 선택",
|
||||
"Select an Ollama instance": "Ollama 인스턴스 선택",
|
||||
"Select Documents": "",
|
||||
"Select model": "모델 선택",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "선택한 모델은 이미지 입력을 지원하지 않습니다.",
|
||||
"Send": "보내기",
|
||||
"Send a Message": "메시지 보내기",
|
||||
"Send message": "메시지 보내기",
|
||||
"September": "9월",
|
||||
"Serper API Key": "Serper API 키",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API 키",
|
||||
"Server connection verified": "서버 연결 확인됨",
|
||||
"Set as default": "기본값으로 설정",
|
||||
"Set Default Model": "기본 모델 설정",
|
||||
"Set embedding model (e.g. {{model}})": "임베딩 모델 설정 (예: {{model}})",
|
||||
"Set Image Size": "이미지 크기 설정",
|
||||
"Set Model": "모델 설정",
|
||||
"Set reranking model (e.g. {{model}})": "랭킹 모델 설정 (예: {{model}})",
|
||||
"Set Steps": "단계 설정",
|
||||
"Set Task Model": "작업 모델 설정",
|
||||
@@ -449,8 +483,8 @@
|
||||
"Source": "출처",
|
||||
"Speech recognition error: {{error}}": "음성 인식 오류: {{error}}",
|
||||
"Speech-to-Text Engine": "음성-텍스트 엔진",
|
||||
"SpeechRecognition API is not supported in this browser.": "이 브라우저에서는 SpeechRecognition API를 지원하지 않습니다.",
|
||||
"Stop Sequence": "중지 시퀀스",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT 설정",
|
||||
"Submit": "제출",
|
||||
"Subtitle (e.g. about the Roman Empire)": "캡션 (예: 로마 황제)",
|
||||
@@ -460,6 +494,7 @@
|
||||
"System": "시스템",
|
||||
"System Prompt": "시스템 프롬프트",
|
||||
"Tags": "Tags",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "더 알려주세요:",
|
||||
"Temperature": "Temperature",
|
||||
"Template": "Template",
|
||||
@@ -469,7 +504,9 @@
|
||||
"Thanks for your feedback!": "너의 피드백 감사합니다!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "점수는 0.0 (0%)에서 1.0 (100%) 사이의 값이어야 합니다.",
|
||||
"Theme": "테마",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "이렇게 하면 소중한 대화 내용이 백엔드 데이터베이스에 안전하게 저장됩니다. 감사합니다!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "이 설정은 브라우저 또는 장치 간에 동기화되지 않습니다.",
|
||||
"Thorough explanation": "철저한 설명",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "팁: 각 대체 후 채팅 입력에서 탭 키를 눌러 여러 개의 변수 슬롯을 연속적으로 업데이트하세요.",
|
||||
@@ -481,22 +518,31 @@
|
||||
"to": "~까지",
|
||||
"To access the available model names for downloading,": "다운로드 가능한 모델명을 확인하려면,",
|
||||
"To access the GGUF models available for downloading,": "다운로드 가능한 GGUF 모델을 확인하려면,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "채팅 입력으로.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "오늘",
|
||||
"Toggle settings": "설정 전환",
|
||||
"Toggle sidebar": "사이드바 전환",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Ollama에 접근하는 데 문제가 있나요?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS 설정",
|
||||
"TTS Voice": "",
|
||||
"Type": "형",
|
||||
"Type Hugging Face Resolve (Download) URL": "Hugging Face Resolve (다운로드) URL 입력",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "앗! {{provider}}에 연결하는 데 문제가 있었습니다.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "알 수 없는 파일 유형 '{{file_type}}', 하지만 일반 텍스트로 허용하고 처리합니다.",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "링크 업데이트 및 복사",
|
||||
"Update password": "비밀번호 업데이트",
|
||||
"Upload a GGUF model": "GGUF 모델 업로드",
|
||||
"Upload Files": "파일 업로드",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "업로드 진행 상황",
|
||||
"URL Mode": "URL 모드",
|
||||
"Use '#' in the prompt input to load and select your documents.": "프롬프트 입력에서 '#'를 사용하여 문서를 로드하고 선택하세요.",
|
||||
@@ -515,6 +561,7 @@
|
||||
"Warning": "경고",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "웹 로더를 업데이트하거나 변경할 경우 모든 문서를 다시 가져와야 합니다.",
|
||||
"Web": "웹",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "웹 로더 설정",
|
||||
"Web Params": "웹 파라미터",
|
||||
"Web Search": "웹 검색",
|
||||
@@ -525,18 +572,20 @@
|
||||
"WebUI will make requests to": "WebUI가 요청할 대상:",
|
||||
"What’s New in": "새로운 기능:",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "기록 기능이 꺼져 있으면 이 브라우저의 새 채팅이 다른 장치의 채팅 기록에 나타나지 않습니다.",
|
||||
"Whisper (Local)": "위스퍼 (Local)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "워크스페이스",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "프롬프트 제안 작성 (예: 당신은 누구인가요?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "[주제 또는 키워드]에 대한 50단어 요약문 작성.",
|
||||
"Yesterday": "어제",
|
||||
"You": "당신",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "기본 모델은 복제할 수 없습니다",
|
||||
"You have no archived conversations.": "채팅을 아카이브한 적이 없습니다.",
|
||||
"You have shared this chat": "이 채팅을 공유했습니다.",
|
||||
"You're a helpful assistant.": "당신은 유용한 어시스턴트입니다.",
|
||||
"You're now logged in.": "로그인되었습니다.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "유튜브",
|
||||
"Youtube Loader Settings": "유튜브 로더 설정"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "naudotojas",
|
||||
"About": "Apie",
|
||||
"Account": "Paskyra",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Tiksli informacija",
|
||||
"Active Users": "",
|
||||
"Add": "",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Pridėti naudotoją",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Šių nustatymų pakeitimas bus pritakytas visiems naudotojams.",
|
||||
"admin": "Administratorius",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Administratorių panelė",
|
||||
"Admin Settings": "Administratorių nustatymai",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Gilieji nustatymai",
|
||||
"Advanced Params": "",
|
||||
"all": "visi",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Audio įrašas",
|
||||
"August": "Rugpjūtis",
|
||||
"Auto-playback response": "Automatinis atsakymo skaitymas",
|
||||
"Auto-send input after 3 sec.": "Automatiškai išsiųsti įvestį po 3 sek.",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 bazės nuoroda",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 bazės nuoroda reikalinga.",
|
||||
"available!": "prieinama!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Neteisingas atsakymas",
|
||||
"Banners": "",
|
||||
"Base Model (From)": "",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "prieš",
|
||||
"Being lazy": "Būvimas tingiu",
|
||||
"Brave Search API Key": "",
|
||||
"Bypass SSL verification for Websites": "Išvengti SSL patikros puslapiams",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Atšaukti",
|
||||
"Capabilities": "",
|
||||
"Change Password": "Keisti slaptažodį",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Blokų nustatymai",
|
||||
"Chunk Size": "Blokų dydis",
|
||||
"Citation": "Citata",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Paspauskite čia dėl pagalbos.",
|
||||
"Click here to": "Paspauskite čia, kad:",
|
||||
"Click here to select": "Spauskite čia norėdami pasirinkti",
|
||||
"Click here to select a csv file.": "Spauskite čia tam, kad pasirinkti csv failą",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Spauskite čia norėdami pasirinkti dokumentus.",
|
||||
"click here.": "paspauskite čia.",
|
||||
"Click on the user role button to change a user's role.": "Paspauskite ant naudotojo rolės mygtuko tam, kad pakeisti naudotojo rolę.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "",
|
||||
"Confirm Password": "Patvirtinkite slaptažodį",
|
||||
"Connections": "Ryšiai",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Turinys",
|
||||
"Context Length": "Konteksto ilgis",
|
||||
"Continue Response": "Tęsti atsakymą",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Pokalbio metodas",
|
||||
"Copied shared chat URL to clipboard!": "Nukopijavote pokalbio nuorodą",
|
||||
"Copy": "Kopijuoti",
|
||||
"Copy last code block": "Kopijuoti paskutinį kodo bloką",
|
||||
"Copy last response": "Kopijuoti paskutinį atsakymą",
|
||||
"Copy Link": "Kopijuoti nuorodą",
|
||||
"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :",
|
||||
"Create a model": "",
|
||||
"Create Account": "Créer un compte",
|
||||
"Create new key": "Sukurti naują raktą",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Personalizuota",
|
||||
"Customize models for a specific purpose": "",
|
||||
"Dark": "Tamsus",
|
||||
"Dashboard": "",
|
||||
"Database": "Duomenų bazė",
|
||||
"December": "Gruodis",
|
||||
"Default": "Numatytasis",
|
||||
"Default (Automatic1111)": "Numatytasis (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Numatytasis (SentenceTransformers)",
|
||||
"Default (Web API)": "Numatytasis (API Web)",
|
||||
"Default Model": "",
|
||||
"Default model updated": "Numatytasis modelis atnaujintas",
|
||||
"Default Prompt Suggestions": "Numatytieji užklausų pasiūlymai",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Atrasti užklausas",
|
||||
"Discover, download, and explore custom prompts": "Atrasti ir parsisiųsti užklausas",
|
||||
"Discover, download, and explore model presets": "Atrasti ir parsisiųsti modelių konfigūracija",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Rodyti naudotojo vardą vietoje žodžio Jūs pokalbyje",
|
||||
"Document": "Dokumentas",
|
||||
"Document Settings": "Dokumento nuostatos",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "pvz. '30s', '10m'. Laiko vienetai yra 's', 'm', 'h'.",
|
||||
"Edit": "Redaguoti",
|
||||
"Edit Doc": "Redaguoti dokumentą",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Redaguoti naudotoją",
|
||||
"Email": "El. paštas",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Įveskite rezultatą",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "Įveskite pabaigos sekvenciją",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Įveskite Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Įveskite nuorodą (pvz. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Įveskite nuorododą (pvz. http://localhost:11434",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Eksportuoti dokumentų žemėlapį",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "Eksportuoti užklausas",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Nepavyko sukurti API rakto",
|
||||
"Failed to read clipboard contents": "Nepavyko perskaityti kopijuoklės",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "",
|
||||
"General": "Bendri",
|
||||
"General Settings": "Bendri nustatymai",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "",
|
||||
"Generation Info": "Generavimo informacija",
|
||||
"Good Response": "Geras atsakymas",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Importuoti dokumentų žemėlapį",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "Importuoti užklausas",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Pridėti `--api` kai vykdomas stable-diffusion-webui",
|
||||
"Info": "",
|
||||
"Input commands": "Įvesties komandos",
|
||||
"Install from Github URL": "",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Sąsaja",
|
||||
"Invalid Tag": "Neteisinga žyma",
|
||||
"January": "Sausis",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT žetonas",
|
||||
"Keep Alive": "Išlaikyti aktyviu",
|
||||
"Keyboard shortcuts": "Klaviatūros trumpiniai",
|
||||
"Knowledge": "",
|
||||
"Language": "Kalba",
|
||||
"Last Active": "Paskutinį kartą aktyvus",
|
||||
"Last Modified": "",
|
||||
"Light": "Šviesus",
|
||||
"Listening...": "Klauso...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "Dideli kalbos modeliai gali klysti. Patikrinkite atsakymų teisingumą.",
|
||||
"Local Models": "",
|
||||
"LTR": "",
|
||||
"Made by OpenWebUI Community": "Sukurta OpenWebUI bendruomenės",
|
||||
"Make sure to enclose them with": "Užtikrinktie, kad įtraukiate viduje:",
|
||||
"Manage": "",
|
||||
"Manage Models": "Tvarkyti modelius",
|
||||
"Manage Ollama Models": "Tvarkyti Ollama modelius",
|
||||
"Manage Pipelines": "",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' modelis sėkmingai atsisiųstas.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Modelis '{{modelTag}}' jau atsisiuntimų eilėje.",
|
||||
"Model {{modelId}} not found": "Modelis {{modelId}} nerastas",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "",
|
||||
"New Chat": "Naujas pokalbis",
|
||||
"New Password": "Naujas slaptažodis",
|
||||
"No documents found": "",
|
||||
"No results found": "Rezultatų nerasta",
|
||||
"No search query generated": "",
|
||||
"No source available": "Šaltinių nerasta",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "",
|
||||
"Ollama API disabled": "",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama versija",
|
||||
"On": "Aktyvuota",
|
||||
"Only": "Tiktais",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF dokumentas (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF paveikslėlių skaitymas (OCR)",
|
||||
"pending": "laukiama",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Leidimas naudoti mikrofoną atmestas: {{error}}",
|
||||
"Personalization": "",
|
||||
"Pipelines": "",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Skaityti garsiai",
|
||||
"Record voice": "Įrašyti balsą",
|
||||
"Redirecting you to OpenWebUI Community": "Perkeliam Jus į OpenWebUI bendruomenę",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Atmesta kai neturėtų būti atmesta",
|
||||
"Regenerate": "Generuoti iš naujo",
|
||||
"Release Notes": "Naujovės",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "",
|
||||
"Running": "",
|
||||
"Save": "Išsaugoti",
|
||||
"Save & Create": "Išsaugoti ir sukurti",
|
||||
"Save & Update": "Išsaugoti ir atnaujinti",
|
||||
@@ -399,36 +427,42 @@
|
||||
"Search Documents": "Ieškoti dokumentų",
|
||||
"Search Models": "",
|
||||
"Search Prompts": "Ieškoti užklausų",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_few": "",
|
||||
"Searched {{count}} sites_many": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "Žiūrėti readme.md papildomoms instrukcijoms",
|
||||
"See what's new": "Žiūrėti naujoves",
|
||||
"Seed": "Sėkla",
|
||||
"Select a base model": "",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Pasirinkti režimą",
|
||||
"Select a model": "Pasirinkti modelį",
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "Pasirinkti Ollama instanciją",
|
||||
"Select Documents": "",
|
||||
"Select model": "Pasirinkti modelį",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
"Send": "",
|
||||
"Send a Message": "Siųsti žinutę",
|
||||
"Send message": "Siųsti žinutę",
|
||||
"September": "rugsėjis",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "Serverio sujungimas patvirtintas",
|
||||
"Set as default": "Nustatyti numatytąjį",
|
||||
"Set Default Model": "Nustatyti numatytąjį modelį",
|
||||
"Set embedding model (e.g. {{model}})": "Nustatyti embedding modelį",
|
||||
"Set Image Size": "Nustatyti paveikslėlių dydį",
|
||||
"Set Model": "Nustatyti modelį",
|
||||
"Set reranking model (e.g. {{model}})": "Nustatyti reranking modelį",
|
||||
"Set Steps": "Numatyti etapus",
|
||||
"Set Task Model": "",
|
||||
@@ -452,8 +486,8 @@
|
||||
"Source": "Šaltinis",
|
||||
"Speech recognition error: {{error}}": "Balso atpažinimo problema: {{error}}",
|
||||
"Speech-to-Text Engine": "Balso atpažinimo modelis",
|
||||
"SpeechRecognition API is not supported in this browser.": "Šioje naršyklėje negalimas balso atpažinimas.",
|
||||
"Stop Sequence": "Baigt sekvenciją",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT nustatymai",
|
||||
"Submit": "Pateikti",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Subtitras",
|
||||
@@ -463,6 +497,7 @@
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Sistemos užklausa",
|
||||
"Tags": "Žymos",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Papasakokite daugiau",
|
||||
"Temperature": "Temperatūra",
|
||||
"Template": "Modelis",
|
||||
@@ -472,7 +507,9 @@
|
||||
"Thanks for your feedback!": "Ačiū už atsiliepimus",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Rezultatas turėtų būti tarp 0.0 (0%) ir 1.0 (100%)",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Tai užtikrina, kad Jūsų pokalbiai saugiai saugojami duomenų bazėje. Ačiū!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Šis parametras nesisinchronizuoja su skirtingomis naršyklėmis ir įrankiais.",
|
||||
"Thorough explanation": "Platus paaiškinimas",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Jei norite pakeisti keletą kintamųjų vieną po kitos, spauskite Tab",
|
||||
@@ -484,22 +521,31 @@
|
||||
"to": "kam",
|
||||
"To access the available model names for downloading,": "Tam, kad prieiti prie galimų parsisiųsti modelių",
|
||||
"To access the GGUF models available for downloading,": "Tam, kad prieiti prie galimų parsisiųsti GGUF,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "į pokalbio įvestį",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Šiandien",
|
||||
"Toggle settings": "Atverti/užverti parametrus",
|
||||
"Toggle sidebar": "Atverti/užverti šoninį meniu",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemos prieinant prie Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS parametrai",
|
||||
"TTS Voice": "",
|
||||
"Type": "",
|
||||
"Type Hugging Face Resolve (Download) URL": "Įveskite Hugging Face Resolve nuorodą",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "O ne! Prisijungiant prie {{provider}} kilo problema.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Nepažįstamas '{{file_type}}' failo formatas, tačiau jis priimtas ir bus apdorotas kaip grynas tekstas",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Atnaujinti ir kopijuoti nuorodą",
|
||||
"Update password": "Atnaujinti slaptažodį",
|
||||
"Upload a GGUF model": "Parsisiųsti GGUF modelį",
|
||||
"Upload Files": "",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Įkėlimo progresas",
|
||||
"URL Mode": "URL režimas",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Naudokite '#' norėdami naudoti dokumentą.",
|
||||
@@ -518,6 +564,7 @@
|
||||
"Warning": "",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Jei pakeisite embedding modelį, turėsite reimportuoti visus dokumentus",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web krovimo nustatymai",
|
||||
"Web Params": "Web nustatymai",
|
||||
"Web Search": "",
|
||||
@@ -528,18 +575,20 @@
|
||||
"WebUI will make requests to": "WebUI vykdys užklausas",
|
||||
"What’s New in": "Kas naujo",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kai istorija išjungta, pokalbiai neatsiras jūsų istorijoje.",
|
||||
"Whisper (Local)": "Whisper (lokalus)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Parašykite užklausą",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Parašyk santrumpą trumpesnę nei 50 žodžių šiam tekstui: [tekstas]",
|
||||
"Yesterday": "Vakar",
|
||||
"You": "Jūs",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "",
|
||||
"You have no archived conversations.": "Jūs neturite archyvuotų pokalbių",
|
||||
"You have shared this chat": "Pasidalinote šiuo pokalbiu",
|
||||
"You're a helpful assistant.": "Esi asistentas.",
|
||||
"You're now logged in.": "Esate prisijungę.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube krovimo nustatymai"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "en bruker",
|
||||
"About": "Om",
|
||||
"Account": "Konto",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Nøyaktig informasjon",
|
||||
"Active Users": "",
|
||||
"Add": "Legg til",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Legg til bruker",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Justering av disse innstillingene vil gjelde universelt for alle brukere.",
|
||||
"admin": "administrator",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Administrasjonspanel",
|
||||
"Admin Settings": "Administrasjonsinnstillinger",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Avanserte parametere",
|
||||
"Advanced Params": "Avanserte parametere",
|
||||
"all": "alle",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Lyd",
|
||||
"August": "August",
|
||||
"Auto-playback response": "Automatisk avspilling av svar",
|
||||
"Auto-send input after 3 sec.": "Send automatisk input etter 3 sek.",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Grunn-URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Grunn-URL kreves.",
|
||||
"available!": "tilgjengelig!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Dårlig svar",
|
||||
"Banners": "Bannere",
|
||||
"Base Model (From)": "Grunnmodell (Fra)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "før",
|
||||
"Being lazy": "Er lat",
|
||||
"Brave Search API Key": "Brave Search API-nøkkel",
|
||||
"Bypass SSL verification for Websites": "Omgå SSL-verifisering for nettsteder",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Avbryt",
|
||||
"Capabilities": "Muligheter",
|
||||
"Change Password": "Endre passord",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Chunk-parametere",
|
||||
"Chunk Size": "Chunk-størrelse",
|
||||
"Citation": "Sitering",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Klikk her for hjelp.",
|
||||
"Click here to": "Klikk her for å",
|
||||
"Click here to select": "Klikk her for å velge",
|
||||
"Click here to select a csv file.": "Klikk her for å velge en csv-fil.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Klikk her for å velge dokumenter.",
|
||||
"click here.": "klikk her.",
|
||||
"Click on the user role button to change a user's role.": "Klikk på brukerrolle-knappen for å endre en brukers rolle.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Samtidige forespørsler",
|
||||
"Confirm Password": "Bekreft passord",
|
||||
"Connections": "Tilkoblinger",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Innhold",
|
||||
"Context Length": "Kontekstlengde",
|
||||
"Continue Response": "Fortsett svar",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Samtalemodus",
|
||||
"Copied shared chat URL to clipboard!": "Kopiert delt chat-URL til utklippstavlen!",
|
||||
"Copy": "Kopier",
|
||||
"Copy last code block": "Kopier siste kodeblokk",
|
||||
"Copy last response": "Kopier siste svar",
|
||||
"Copy Link": "Kopier lenke",
|
||||
"Copying to clipboard was successful!": "Kopiering til utklippstavlen var vellykket!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Lag en kort, 3-5 ords frase som en overskrift for den følgende forespørselen, strikt overhold 3-5 ords grensen og unngå bruk av ordet 'tittel':",
|
||||
"Create a model": "Lag en modell",
|
||||
"Create Account": "Opprett konto",
|
||||
"Create new key": "Lag ny nøkkel",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Tilpasset",
|
||||
"Customize models for a specific purpose": "Tilpass modeller for et spesifikt formål",
|
||||
"Dark": "Mørk",
|
||||
"Dashboard": "",
|
||||
"Database": "Database",
|
||||
"December": "Desember",
|
||||
"Default": "Standard",
|
||||
"Default (Automatic1111)": "Standard (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Standard (SentenceTransformers)",
|
||||
"Default (Web API)": "Standard (Web API)",
|
||||
"Default Model": "Standardmodell",
|
||||
"Default model updated": "Standardmodell oppdatert",
|
||||
"Default Prompt Suggestions": "Standard promptforslag",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Oppdag en prompt",
|
||||
"Discover, download, and explore custom prompts": "Oppdag, last ned og utforsk egendefinerte prompts",
|
||||
"Discover, download, and explore model presets": "Oppdag, last ned og utforsk modellforhåndsinnstillinger",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Vis brukernavnet i stedet for Du i chatten",
|
||||
"Document": "Dokument",
|
||||
"Document Settings": "Dokumentinnstillinger",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "f.eks. '30s','10m'. Gyldige tidsenheter er 's', 'm', 't'.",
|
||||
"Edit": "Rediger",
|
||||
"Edit Doc": "Rediger dokument",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Rediger bruker",
|
||||
"Email": "E-post",
|
||||
"Embedding Batch Size": "Batch-størrelse for embedding",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Skriv inn poengsum",
|
||||
"Enter Searxng Query URL": "Skriv inn Searxng forespørsels-URL",
|
||||
"Enter Serper API Key": "Skriv inn Serper API-nøkkel",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Skriv inn Serpstack API-nøkkel",
|
||||
"Enter stop sequence": "Skriv inn stoppsekvens",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Skriv inn Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Skriv inn URL (f.eks. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Skriv inn URL (f.eks. http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Eksporter dokumentkartlegging",
|
||||
"Export Models": "Eksporter modeller",
|
||||
"Export Prompts": "Eksporter prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Kunne ikke opprette API-nøkkel.",
|
||||
"Failed to read clipboard contents": "Kunne ikke lese utklippstavleinnhold",
|
||||
"Failed to update settings": "Kunne ikke oppdatere innstillinger",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Frekvensstraff",
|
||||
"General": "Generelt",
|
||||
"General Settings": "Generelle innstillinger",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Genererer søkeforespørsel",
|
||||
"Generation Info": "Generasjonsinfo",
|
||||
"Good Response": "Godt svar",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Importer dokumentkartlegging",
|
||||
"Import Models": "Importer modeller",
|
||||
"Import Prompts": "Importer prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inkluder `--api`-flagget når du kjører stable-diffusion-webui",
|
||||
"Info": "Info",
|
||||
"Input commands": "Inntast kommandoer",
|
||||
"Install from Github URL": "Installer fra Github-URL",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Grensesnitt",
|
||||
"Invalid Tag": "Ugyldig tag",
|
||||
"January": "Januar",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT-token",
|
||||
"Keep Alive": "Hold i live",
|
||||
"Keyboard shortcuts": "Hurtigtaster",
|
||||
"Knowledge": "",
|
||||
"Language": "Språk",
|
||||
"Last Active": "Sist aktiv",
|
||||
"Last Modified": "",
|
||||
"Light": "Lys",
|
||||
"Listening...": "Lytter...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLM-er kan gjøre feil. Verifiser viktig informasjon.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Laget av OpenWebUI-fellesskapet",
|
||||
"Make sure to enclose them with": "Sørg for å omslutte dem med",
|
||||
"Manage": "",
|
||||
"Manage Models": "Administrer modeller",
|
||||
"Manage Ollama Models": "Administrer Ollama-modeller",
|
||||
"Manage Pipelines": "Administrer pipelines",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Modellen '{{modelName}}' er lastet ned.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Modellen '{{modelTag}}' er allerede i nedlastingskøen.",
|
||||
"Model {{modelId}} not found": "Modellen {{modelId}} ble ikke funnet",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Gi modellen din et navn",
|
||||
"New Chat": "Ny chat",
|
||||
"New Password": "Nytt passord",
|
||||
"No documents found": "",
|
||||
"No results found": "Ingen resultater funnet",
|
||||
"No search query generated": "Ingen søkeforespørsel generert",
|
||||
"No source available": "Ingen kilde tilgjengelig",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API deaktivert",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama versjon",
|
||||
"On": "På",
|
||||
"Only": "Kun",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF-dokument (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF-ekstraktbilder (OCR)",
|
||||
"pending": "avventer",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Tillatelse nektet ved tilgang til mikrofon: {{error}}",
|
||||
"Personalization": "Personalisering",
|
||||
"Pipelines": "Pipelines",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Les høyt",
|
||||
"Record voice": "Ta opp stemme",
|
||||
"Redirecting you to OpenWebUI Community": "Omdirigerer deg til OpenWebUI-fellesskapet",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Avvist når det ikke skulle ha vært det",
|
||||
"Regenerate": "Regenerer",
|
||||
"Release Notes": "Utgivelsesnotater",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Lagre",
|
||||
"Save & Create": "Lagre og opprett",
|
||||
"Save & Update": "Lagre og oppdater",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "Søk dokumenter",
|
||||
"Search Models": "Søk modeller",
|
||||
"Search Prompts": "Søk prompter",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Antall søkeresultater",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Søkte på {{count}} side",
|
||||
"Searched {{count}} sites_other": "Søkte på {{count}} sider",
|
||||
"Searching the web for '{{searchQuery}}'": "Søker på nettet etter '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng forespørsels-URL",
|
||||
"See readme.md for instructions": "Se readme.md for instruksjoner",
|
||||
"See what's new": "Se hva som er nytt",
|
||||
"Seed": "Seed",
|
||||
"Select a base model": "Velg en grunnmodell",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Velg en modus",
|
||||
"Select a model": "Velg en modell",
|
||||
"Select a pipeline": "Velg en pipeline",
|
||||
"Select a pipeline url": "Velg en pipeline-URL",
|
||||
"Select an Ollama instance": "Velg en Ollama-instans",
|
||||
"Select Documents": "",
|
||||
"Select model": "Velg modell",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Valgte modell(er) støtter ikke bildeforslag",
|
||||
"Send": "Send",
|
||||
"Send a Message": "Send en melding",
|
||||
"Send message": "Send melding",
|
||||
"September": "September",
|
||||
"Serper API Key": "Serper API-nøkkel",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API-nøkkel",
|
||||
"Server connection verified": "Servertilkobling bekreftet",
|
||||
"Set as default": "Sett som standard",
|
||||
"Set Default Model": "Sett standardmodell",
|
||||
"Set embedding model (e.g. {{model}})": "Sett embedding-modell (f.eks. {{model}})",
|
||||
"Set Image Size": "Sett bildestørrelse",
|
||||
"Set Model": "Sett modell",
|
||||
"Set reranking model (e.g. {{model}})": "Sett reranking-modell (f.eks. {{model}})",
|
||||
"Set Steps": "Sett steg",
|
||||
"Set Task Model": "Sett oppgavemodell",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "Kilde",
|
||||
"Speech recognition error: {{error}}": "Feil ved talegjenkjenning: {{error}}",
|
||||
"Speech-to-Text Engine": "Tale-til-tekst-motor",
|
||||
"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API støttes ikke i denne nettleseren.",
|
||||
"Stop Sequence": "Stoppsekvens",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT-innstillinger",
|
||||
"Submit": "Send inn",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Undertittel (f.eks. om Romerriket)",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "System",
|
||||
"System Prompt": "Systemprompt",
|
||||
"Tags": "Tagger",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Fortell oss mer:",
|
||||
"Temperature": "Temperatur",
|
||||
"Template": "Mal",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "Takk for tilbakemeldingen!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Poengsummen skal være en verdi mellom 0,0 (0%) og 1,0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dette sikrer at dine verdifulle samtaler er trygt lagret i backend-databasen din. Takk!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Denne innstillingen synkroniseres ikke mellom nettlesere eller enheter.",
|
||||
"Thorough explanation": "Grundig forklaring",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tips: Oppdater flere variabelplasser etter hverandre ved å trykke på tab-tasten i chatinputen etter hver erstatning.",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "til",
|
||||
"To access the available model names for downloading,": "For å få tilgang til tilgjengelige modelnavn for nedlasting,",
|
||||
"To access the GGUF models available for downloading,": "For å få tilgang til GGUF-modellene som er tilgjengelige for nedlasting,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "til chatinput.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "I dag",
|
||||
"Toggle settings": "Veksle innstillinger",
|
||||
"Toggle sidebar": "Veksle sidefelt",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemer med tilgang til Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS-innstillinger",
|
||||
"TTS Voice": "",
|
||||
"Type": "Type",
|
||||
"Type Hugging Face Resolve (Download) URL": "Skriv inn Hugging Face Resolve (nedlasting) URL",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Oops! Det oppsto et problem med tilkoblingen til {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Ukjent filtype '{{file_type}}', men aksepteres og behandles som ren tekst",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Oppdater og kopier lenke",
|
||||
"Update password": "Oppdater passord",
|
||||
"Upload a GGUF model": "Last opp en GGUF-modell",
|
||||
"Upload Files": "Last opp filer",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Opplastingsfremdrift",
|
||||
"URL Mode": "URL-modus",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Bruk '#' i prompt-input for å laste og velge dokumentene dine.",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "Advarsel",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Advarsel: Hvis du oppdaterer eller endrer embedding-modellen din, må du re-importere alle dokumenter.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Web-lasterinnstillinger",
|
||||
"Web Params": "Web-parametere",
|
||||
"Web Search": "Websøk",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "WebUI vil gjøre forespørsler til",
|
||||
"What’s New in": "Hva er nytt i",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Når historikken er slått av, vil nye chatter på denne nettleseren ikke vises i historikken din på noen av enhetene dine.",
|
||||
"Whisper (Local)": "Whisper (lokal)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Arbeidsområde",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Skriv et promptforslag (f.eks. Hvem er du?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Skriv et sammendrag på 50 ord som oppsummerer [emne eller nøkkelord].",
|
||||
"Yesterday": "I går",
|
||||
"You": "Du",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "Du kan ikke klone en grunnmodell",
|
||||
"You have no archived conversations.": "Du har ingen arkiverte samtaler.",
|
||||
"You have shared this chat": "Du har delt denne chatten",
|
||||
"You're a helpful assistant.": "Du er en hjelpsom assistent.",
|
||||
"You're now logged in.": "Du er nå logget inn.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube-lasterinnstillinger"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "een gebruiker",
|
||||
"About": "Over",
|
||||
"Account": "Account",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Accurate informatie",
|
||||
"Active Users": "",
|
||||
"Add": "Toevoegen",
|
||||
@@ -29,8 +30,10 @@
|
||||
"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",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Administratieve Paneel",
|
||||
"Admin Settings": "Administratieve Settings",
|
||||
"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": "alle",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Audio",
|
||||
"August": "Augustus",
|
||||
"Auto-playback response": "Automatisch afspelen van antwoord",
|
||||
"Auto-send input after 3 sec.": "Automatisch verzenden van input na 3 sec.",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Basis URL is verplicht",
|
||||
"available!": "beschikbaar!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Ongeldig antwoord",
|
||||
"Banners": "Banners",
|
||||
"Base Model (From)": "Basismodel (vanaf)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "voor",
|
||||
"Being lazy": "Lustig zijn",
|
||||
"Brave Search API Key": "Brave Search API-sleutel",
|
||||
"Bypass SSL verification for Websites": "SSL-verificatie omzeilen voor websites",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Annuleren",
|
||||
"Capabilities": "Mogelijkheden",
|
||||
"Change Password": "Wijzig Wachtwoord",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Chunk Params",
|
||||
"Chunk Size": "Chunk Grootte",
|
||||
"Citation": "Citaat",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Klik hier voor hulp.",
|
||||
"Click here to": "Klik hier om",
|
||||
"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 select documents.": "Klik hier om documenten te selecteren",
|
||||
"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.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Gelijktijdige verzoeken",
|
||||
"Confirm Password": "Bevestig Wachtwoord",
|
||||
"Connections": "Verbindingen",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Inhoud",
|
||||
"Context Length": "Context Lengte",
|
||||
"Continue Response": "Doorgaan met Antwoord",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Gespreksmodus",
|
||||
"Copied shared chat URL to clipboard!": "URL van gedeelde gesprekspagina gekopieerd naar klembord!",
|
||||
"Copy": "Kopieer",
|
||||
"Copy last code block": "Kopieer laatste code blok",
|
||||
"Copy last response": "Kopieer laatste antwoord",
|
||||
"Copy Link": "Kopieer Link",
|
||||
"Copying to clipboard was successful!": "Kopiëren naar klembord was succesvol!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Maak een beknopte, 3-5 woorden tellende zin als kop voor de volgende query, strikt aanhoudend aan de 3-5 woorden limiet en het vermijden van het gebruik van het woord 'titel':",
|
||||
"Create a model": "Een model maken",
|
||||
"Create Account": "Maak Account",
|
||||
"Create new key": "Maak nieuwe sleutel",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Aangepast",
|
||||
"Customize models for a specific purpose": "Modellen aanpassen voor een specifiek doel",
|
||||
"Dark": "Donker",
|
||||
"Dashboard": "",
|
||||
"Database": "Database",
|
||||
"December": "December",
|
||||
"Default": "Standaard",
|
||||
"Default (Automatic1111)": "Standaard (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Standaard (SentenceTransformers)",
|
||||
"Default (Web API)": "Standaard (Web API)",
|
||||
"Default Model": "Standaard model",
|
||||
"Default model updated": "Standaard model bijgewerkt",
|
||||
"Default Prompt Suggestions": "Standaard Prompt Suggesties",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Ontdek een prompt",
|
||||
"Discover, download, and explore custom prompts": "Ontdek, download en verken aangepaste prompts",
|
||||
"Discover, download, and explore model presets": "Ontdek, download en verken model presets",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Toon de gebruikersnaam in plaats van Jij in de Chat",
|
||||
"Document": "Document",
|
||||
"Document Settings": "Document Instellingen",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "bijv. '30s', '10m'. Geldige tijdseenheden zijn 's', 'm', 'h'.",
|
||||
"Edit": "Wijzig",
|
||||
"Edit Doc": "Wijzig Doc",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Wijzig Gebruiker",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Voeg score toe",
|
||||
"Enter Searxng Query URL": "Voer de URL van de Searxng-query in",
|
||||
"Enter Serper API Key": "Voer de Serper API-sleutel in",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Voer de Serpstack API-sleutel in",
|
||||
"Enter stop sequence": "Zet stop sequentie",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Voeg Top K toe",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Zet URL (Bijv. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Zet URL (Bijv. http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Exporteer Documenten Mapping",
|
||||
"Export Models": "Modellen exporteren",
|
||||
"Export Prompts": "Exporteer Prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Kan API Key niet aanmaken.",
|
||||
"Failed to read clipboard contents": "Kan klembord inhoud niet lezen",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Frequentie Straf",
|
||||
"General": "Algemeen",
|
||||
"General Settings": "Algemene Instellingen",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Zoekopdracht genereren",
|
||||
"Generation Info": "Generatie Info",
|
||||
"Good Response": "Goede Antwoord",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Importeer Documenten Mapping",
|
||||
"Import Models": "Modellen importeren",
|
||||
"Import Prompts": "Importeer Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Voeg `--api` vlag toe bij het uitvoeren van stable-diffusion-webui",
|
||||
"Info": "Info",
|
||||
"Input commands": "Voer commando's in",
|
||||
"Install from Github URL": "Installeren vanaf Github-URL",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Interface",
|
||||
"Invalid Tag": "Ongeldige Tag",
|
||||
"January": "Januari",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT Token",
|
||||
"Keep Alive": "Houd Actief",
|
||||
"Keyboard shortcuts": "Toetsenbord snelkoppelingen",
|
||||
"Knowledge": "",
|
||||
"Language": "Taal",
|
||||
"Last Active": "Laatst Actief",
|
||||
"Last Modified": "",
|
||||
"Light": "Licht",
|
||||
"Listening...": "Luisteren...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLMs kunnen fouten maken. Verifieer belangrijke informatie.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Gemaakt door OpenWebUI Community",
|
||||
"Make sure to enclose them with": "Zorg ervoor dat je ze omringt met",
|
||||
"Manage": "",
|
||||
"Manage Models": "Beheer Modellen",
|
||||
"Manage Ollama Models": "Beheer Ollama Modellen",
|
||||
"Manage Pipelines": "Pijplijnen beheren",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' is succesvol gedownload.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' staat al in de wachtrij voor downloaden.",
|
||||
"Model {{modelId}} not found": "Model {{modelId}} niet gevonden",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Geef uw model een naam",
|
||||
"New Chat": "Nieuwe Chat",
|
||||
"New Password": "Nieuw Wachtwoord",
|
||||
"No documents found": "",
|
||||
"No results found": "Geen resultaten gevonden",
|
||||
"No search query generated": "Geen zoekopdracht gegenereerd",
|
||||
"No source available": "Geen bron beschikbaar",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API uitgeschakeld",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Ollama Versie",
|
||||
"On": "Aan",
|
||||
"Only": "Alleen",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF document (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
|
||||
"pending": "wachtend",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Toestemming geweigerd bij toegang tot microfoon: {{error}}",
|
||||
"Personalization": "Personalisatie",
|
||||
"Pipelines": "Pijpleidingen",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Voorlezen",
|
||||
"Record voice": "Neem stem op",
|
||||
"Redirecting you to OpenWebUI Community": "Je wordt doorgestuurd naar OpenWebUI Community",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Geweigerd terwijl het niet had moeten",
|
||||
"Regenerate": "Regenereren",
|
||||
"Release Notes": "Release Notes",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Opslaan",
|
||||
"Save & Create": "Opslaan & Creëren",
|
||||
"Save & Update": "Opslaan & Bijwerken",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "Zoek Documenten",
|
||||
"Search Models": "Modellen zoeken",
|
||||
"Search Prompts": "Zoek Prompts",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Aantal zoekresultaten",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Gezocht op {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Gezocht op {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Zoeken op internet naar '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng Query URL",
|
||||
"See readme.md for instructions": "Zie readme.md voor instructies",
|
||||
"See what's new": "Zie wat er nieuw is",
|
||||
"Seed": "Seed",
|
||||
"Select a base model": "Selecteer een basismodel",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Selecteer een modus",
|
||||
"Select a model": "Selecteer een model",
|
||||
"Select a pipeline": "Selecteer een pijplijn",
|
||||
"Select a pipeline url": "Selecteer een pijplijn-URL",
|
||||
"Select an Ollama instance": "Selecteer een Ollama instantie",
|
||||
"Select Documents": "",
|
||||
"Select model": "Selecteer een model",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Geselecteerde modellen ondersteunen geen beeldinvoer",
|
||||
"Send": "Verzenden",
|
||||
"Send a Message": "Stuur een Bericht",
|
||||
"Send message": "Stuur bericht",
|
||||
"September": "September",
|
||||
"Serper API Key": "Serper API-sleutel",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API-sleutel",
|
||||
"Server connection verified": "Server verbinding geverifieerd",
|
||||
"Set as default": "Stel in als standaard",
|
||||
"Set Default Model": "Stel Standaard Model in",
|
||||
"Set embedding model (e.g. {{model}})": "Stel embedding model in (bv. {{model}})",
|
||||
"Set Image Size": "Stel Afbeelding Grootte in",
|
||||
"Set Model": "Stel die model op",
|
||||
"Set reranking model (e.g. {{model}})": "Stel reranking model in (bv. {{model}})",
|
||||
"Set Steps": "Stel Stappen in",
|
||||
"Set Task Model": "Taakmodel instellen",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "Bron",
|
||||
"Speech recognition error: {{error}}": "Spraakherkenning fout: {{error}}",
|
||||
"Speech-to-Text Engine": "Spraak-naar-tekst Engine",
|
||||
"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API wordt niet ondersteund in deze browser.",
|
||||
"Stop Sequence": "Stop Sequentie",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT Instellingen",
|
||||
"Submit": "Verzenden",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Ondertitel (bijv. over de Romeinse Empire)",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "Systeem",
|
||||
"System Prompt": "Systeem Prompt",
|
||||
"Tags": "Tags",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Vertel ons meer:",
|
||||
"Temperature": "Temperatuur",
|
||||
"Template": "Template",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "Bedankt voor uw feedback!",
|
||||
"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 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 setting does not sync across browsers or devices.": "Deze instelling wordt niet gesynchroniseerd tussen browsers of apparaten.",
|
||||
"Thorough explanation": "Gevorderde uitleg",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tip: Werk meerdere variabele slots achtereenvolgens bij door op de tab-toets te drukken in de chat input na elke vervanging.",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "naar",
|
||||
"To access the available model names for downloading,": "Om de beschikbare modelnamen voor downloaden te openen,",
|
||||
"To access the GGUF models available for downloading,": "Om toegang te krijgen tot de GGUF modellen die beschikbaar zijn voor downloaden,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "naar chat input.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Vandaag",
|
||||
"Toggle settings": "Wissel instellingen",
|
||||
"Toggle sidebar": "Wissel sidebar",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemen met toegang tot Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS instellingen",
|
||||
"TTS Voice": "",
|
||||
"Type": "Type",
|
||||
"Type Hugging Face Resolve (Download) URL": "Type Hugging Face Resolve (Download) URL",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Er was een probleem met verbinden met {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Onbekend Bestandstype '{{file_type}}', maar accepteren en behandelen als platte tekst",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Update en Kopieer Link",
|
||||
"Update password": "Wijzig wachtwoord",
|
||||
"Upload a GGUF model": "Upload een GGUF model",
|
||||
"Upload Files": "Bestanden uploaden",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Upload Voortgang",
|
||||
"URL Mode": "URL Modus",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Gebruik '#' in de prompt input om je documenten te laden en te selecteren.",
|
||||
@@ -516,6 +562,7 @@
|
||||
"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": "",
|
||||
"Web Loader Settings": "Web Loader instellingen",
|
||||
"Web Params": "Web Params",
|
||||
"Web Search": "Zoeken op het web",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "WebUI zal verzoeken doen naar",
|
||||
"What’s New in": "Wat is nieuw in",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Wanneer geschiedenis is uitgeschakeld, zullen nieuwe chats op deze browser niet verschijnen in je geschiedenis op een van je apparaten.",
|
||||
"Whisper (Local)": "Fluister (Lokaal)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"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.",
|
||||
"Yesterday": "gisteren",
|
||||
"You": "U",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "U kunt een basismodel niet klonen",
|
||||
"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.",
|
||||
"You're now logged in.": "Je bent nu ingelogd.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Youtube-laderinstellingen"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "ਇੱਕ ਉਪਭੋਗਤਾ",
|
||||
"About": "ਬਾਰੇ",
|
||||
"Account": "ਖਾਤਾ",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "ਸਹੀ ਜਾਣਕਾਰੀ",
|
||||
"Active Users": "",
|
||||
"Add": "ਸ਼ਾਮਲ ਕਰੋ",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "ਉਪਭੋਗਤਾ ਸ਼ਾਮਲ ਕਰੋ",
|
||||
"Adjusting these settings will apply changes universally to all users.": "ਇਹ ਸੈਟਿੰਗਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਨਾਲ ਸਾਰੇ ਉਪਭੋਗਤਾਵਾਂ ਲਈ ਬਦਲਾਅ ਲਾਗੂ ਹੋਣਗੇ।",
|
||||
"admin": "ਪ੍ਰਬੰਧਕ",
|
||||
"Admin": "",
|
||||
"Admin Panel": "ਪ੍ਰਬੰਧਕ ਪੈਨਲ",
|
||||
"Admin Settings": "ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "ਉੱਚ ਸਤਰ ਦੇ ਪੈਰਾਮੀਟਰ",
|
||||
"Advanced Params": "ਐਡਵਾਂਸਡ ਪਰਮਜ਼",
|
||||
"all": "ਸਾਰੇ",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "ਆਡੀਓ",
|
||||
"August": "ਅਗਸਤ",
|
||||
"Auto-playback response": "ਆਟੋ-ਪਲੇਬੈਕ ਜਵਾਬ",
|
||||
"Auto-send input after 3 sec.": "3 ਸਕਿੰਟ ਬਾਅਦ ਆਟੋ-ਭੇਜੋ ਇਨਪੁਟ",
|
||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 ਬੇਸ URL",
|
||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 ਬੇਸ URL ਦੀ ਲੋੜ ਹੈ।",
|
||||
"available!": "ਉਪਲਬਧ ਹੈ!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "ਖਰਾਬ ਜਵਾਬ",
|
||||
"Banners": "ਬੈਨਰ",
|
||||
"Base Model (From)": "ਬੇਸ ਮਾਡਲ (ਤੋਂ)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "ਪਹਿਲਾਂ",
|
||||
"Being lazy": "ਆਲਸੀ ਹੋਣਾ",
|
||||
"Brave Search API Key": "ਬਹਾਦਰ ਖੋਜ API ਕੁੰਜੀ",
|
||||
"Bypass SSL verification for Websites": "ਵੈਬਸਾਈਟਾਂ ਲਈ SSL ਪ੍ਰਮਾਣਿਕਤਾ ਨੂੰ ਬਾਈਪਾਸ ਕਰੋ",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "ਰੱਦ ਕਰੋ",
|
||||
"Capabilities": "ਸਮਰੱਥਾਵਾਂ",
|
||||
"Change Password": "ਪਾਸਵਰਡ ਬਦਲੋ",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "ਚੰਕ ਪੈਰਾਮੀਟਰ",
|
||||
"Chunk Size": "ਚੰਕ ਆਕਾਰ",
|
||||
"Citation": "ਹਵਾਲਾ",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "ਮਦਦ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
|
||||
"Click here to": "ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ",
|
||||
"Click here to select": "ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ",
|
||||
"Click here to select a csv file.": "CSV ਫਾਈਲ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "ਡਾਕੂਮੈਂਟ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
|
||||
"click here.": "ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
|
||||
"Click on the user role button to change a user's role.": "ਉਪਭੋਗਤਾ ਦੀ ਭੂਮਿਕਾ ਬਦਲਣ ਲਈ ਉਪਭੋਗਤਾ ਭੂਮਿਕਾ ਬਟਨ 'ਤੇ ਕਲਿੱਕ ਕਰੋ।",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "ਸਮਕਾਲੀ ਬੇਨਤੀਆਂ",
|
||||
"Confirm Password": "ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ",
|
||||
"Connections": "ਕਨੈਕਸ਼ਨ",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "ਸਮੱਗਰੀ",
|
||||
"Context Length": "ਸੰਦਰਭ ਲੰਬਾਈ",
|
||||
"Continue Response": "ਜਵਾਬ ਜਾਰੀ ਰੱਖੋ",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "ਗੱਲਬਾਤ ਮੋਡ",
|
||||
"Copied shared chat URL to clipboard!": "ਸਾਂਝੇ ਕੀਤੇ ਗੱਲਬਾਤ URL ਨੂੰ ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰ ਦਿੱਤਾ!",
|
||||
"Copy": "ਕਾਪੀ ਕਰੋ",
|
||||
"Copy last code block": "ਆਖਰੀ ਕੋਡ ਬਲਾਕ ਨੂੰ ਕਾਪੀ ਕਰੋ",
|
||||
"Copy last response": "ਆਖਰੀ ਜਵਾਬ ਨੂੰ ਕਾਪੀ ਕਰੋ",
|
||||
"Copy Link": "ਲਿੰਕ ਕਾਪੀ ਕਰੋ",
|
||||
"Copying to clipboard was successful!": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰਨਾ ਸਫਲ ਰਿਹਾ!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "ਹੇਠਾਂ ਦਿੱਤੀ ਪੁੱਛਗਿੱਛ ਲਈ ਇੱਕ ਛੋਟਾ, 3-5 ਸ਼ਬਦਾਂ ਦਾ ਵਾਕ ਬਣਾਓ, 3-5 ਸ਼ਬਦਾਂ ਦੀ ਸੀਮਾ ਦਾ ਪਾਲਣ ਕਰਦੇ ਹੋਏ ਅਤੇ 'ਸਿਰਲੇਖ' ਸ਼ਬਦ ਦੇ ਇਸਤੇਮਾਲ ਤੋਂ ਬਚਦੇ ਹੋਏ:",
|
||||
"Create a model": "ਇੱਕ ਮਾਡਲ ਬਣਾਓ",
|
||||
"Create Account": "ਖਾਤਾ ਬਣਾਓ",
|
||||
"Create new key": "ਨਵੀਂ ਕੁੰਜੀ ਬਣਾਓ",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "ਕਸਟਮ",
|
||||
"Customize models for a specific purpose": "ਕਿਸੇ ਖਾਸ ਉਦੇਸ਼ ਲਈ ਮਾਡਲਾਂ ਨੂੰ ਅਨੁਕੂਲਿਤ ਕਰੋ",
|
||||
"Dark": "ਗੂੜ੍ਹਾ",
|
||||
"Dashboard": "",
|
||||
"Database": "ਡਾਟਾਬੇਸ",
|
||||
"December": "ਦਸੰਬਰ",
|
||||
"Default": "ਮੂਲ",
|
||||
"Default (Automatic1111)": "ਮੂਲ (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "ਮੂਲ (ਸੈਂਟੈਂਸਟ੍ਰਾਂਸਫਾਰਮਰਸ)",
|
||||
"Default (Web API)": "ਮੂਲ (ਵੈਬ API)",
|
||||
"Default Model": "ਡਿਫਾਲਟ ਮਾਡਲ",
|
||||
"Default model updated": "ਮੂਲ ਮਾਡਲ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ",
|
||||
"Default Prompt Suggestions": "ਮੂਲ ਪ੍ਰੰਪਟ ਸੁਝਾਅ",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "ਇੱਕ ਪ੍ਰੰਪਟ ਖੋਜੋ",
|
||||
"Discover, download, and explore custom prompts": "ਕਸਟਮ ਪ੍ਰੰਪਟਾਂ ਨੂੰ ਖੋਜੋ, ਡਾਊਨਲੋਡ ਕਰੋ ਅਤੇ ਪੜਚੋਲ ਕਰੋ",
|
||||
"Discover, download, and explore model presets": "ਮਾਡਲ ਪ੍ਰੀਸੈਟਾਂ ਨੂੰ ਖੋਜੋ, ਡਾਊਨਲੋਡ ਕਰੋ ਅਤੇ ਪੜਚੋਲ ਕਰੋ",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "ਗੱਲਬਾਤ 'ਚ ਤੁਹਾਡੇ ਸਥਾਨ 'ਤੇ ਉਪਭੋਗਤਾ ਨਾਮ ਦਿਖਾਓ",
|
||||
"Document": "ਡਾਕੂਮੈਂਟ",
|
||||
"Document Settings": "ਡਾਕੂਮੈਂਟ ਸੈਟਿੰਗਾਂ",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "ਉਦਾਹਰਣ ਲਈ '30ਸ','10ਮਿ'. ਸਹੀ ਸਮਾਂ ਇਕਾਈਆਂ ਹਨ 'ਸ', 'ਮ', 'ਘੰ'.",
|
||||
"Edit": "ਸੰਪਾਦਨ ਕਰੋ",
|
||||
"Edit Doc": "ਡਾਕੂਮੈਂਟ ਸੰਪਾਦਨ ਕਰੋ",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "ਉਪਭੋਗਤਾ ਸੰਪਾਦਨ ਕਰੋ",
|
||||
"Email": "ਈਮੇਲ",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "ਸਕੋਰ ਦਰਜ ਕਰੋ",
|
||||
"Enter Searxng Query URL": "Searxng Query URL ਦਾਖਲ ਕਰੋ",
|
||||
"Enter Serper API Key": "Serper API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ",
|
||||
"Enter stop sequence": "ਰੋਕਣ ਦਾ ਕ੍ਰਮ ਦਰਜ ਕਰੋ",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "ਸਿਖਰ K ਦਰਜ ਕਰੋ",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "URL ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "URL ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਨਿਰਯਾਤ ਕਰੋ",
|
||||
"Export Models": "ਨਿਰਯਾਤ ਮਾਡਲ",
|
||||
"Export Prompts": "ਪ੍ਰੰਪਟ ਨਿਰਯਾਤ ਕਰੋ",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API ਕੁੰਜੀ ਬਣਾਉਣ ਵਿੱਚ ਅਸਫਲ।",
|
||||
"Failed to read clipboard contents": "ਕਲਿੱਪਬੋਰਡ ਸਮੱਗਰੀ ਪੜ੍ਹਣ ਵਿੱਚ ਅਸਫਲ",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "ਬਾਰੰਬਾਰਤਾ ਜੁਰਮਾਨਾ",
|
||||
"General": "ਆਮ",
|
||||
"General Settings": "ਆਮ ਸੈਟਿੰਗਾਂ",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "ਖੋਜ ਪੁੱਛਗਿੱਛ ਤਿਆਰ ਕਰਨਾ",
|
||||
"Generation Info": "ਜਨਰੇਸ਼ਨ ਜਾਣਕਾਰੀ",
|
||||
"Good Response": "ਵਧੀਆ ਜਵਾਬ",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਆਯਾਤ ਕਰੋ",
|
||||
"Import Models": "ਮਾਡਲ ਆਯਾਤ ਕਰੋ",
|
||||
"Import Prompts": "ਪ੍ਰੰਪਟ ਆਯਾਤ ਕਰੋ",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "ਸਟੇਬਲ-ਡਿਫਿਊਸ਼ਨ-ਵੈਬਯੂਆਈ ਚਲਾਉਣ ਸਮੇਂ `--api` ਝੰਡਾ ਸ਼ਾਮਲ ਕਰੋ",
|
||||
"Info": "ਜਾਣਕਾਰੀ",
|
||||
"Input commands": "ਇਨਪੁਟ ਕਮਾਂਡਾਂ",
|
||||
"Install from Github URL": "Github URL ਤੋਂ ਇੰਸਟਾਲ ਕਰੋ",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "ਇੰਟਰਫੇਸ",
|
||||
"Invalid Tag": "ਗਲਤ ਟੈਗ",
|
||||
"January": "ਜਨਵਰੀ",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "JWT ਟੋਕਨ",
|
||||
"Keep Alive": "ਜੀਵਿਤ ਰੱਖੋ",
|
||||
"Keyboard shortcuts": "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕਟ",
|
||||
"Knowledge": "",
|
||||
"Language": "ਭਾਸ਼ਾ",
|
||||
"Last Active": "ਆਖਰੀ ਸਰਗਰਮ",
|
||||
"Last Modified": "",
|
||||
"Light": "ਹਲਕਾ",
|
||||
"Listening...": "ਸੁਣ ਰਿਹਾ ਹੈ...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLMs ਗਲਤੀਆਂ ਕਰ ਸਕਦੇ ਹਨ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ",
|
||||
"Make sure to enclose them with": "ਸੁਨਿਸ਼ਚਿਤ ਕਰੋ ਕਿ ਉਨ੍ਹਾਂ ਨੂੰ ਘੇਰੋ",
|
||||
"Manage": "",
|
||||
"Manage Models": "ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
|
||||
"Manage Ollama Models": "ਓਲਾਮਾ ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
|
||||
"Manage Pipelines": "ਪਾਈਪਲਾਈਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "ਮਿਰੋਸਟੈਟ ਟਾਉ",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "ਮਾਡਲ '{{modelName}}' ਸਫਲਤਾਪੂਰਵਕ ਡਾਊਨਲੋਡ ਕੀਤਾ ਗਿਆ ਹੈ।",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "ਮਾਡਲ '{{modelTag}}' ਪਹਿਲਾਂ ਹੀ ਡਾਊਨਲੋਡ ਲਈ ਕਤਾਰ ਵਿੱਚ ਹੈ।",
|
||||
"Model {{modelId}} not found": "ਮਾਡਲ {{modelId}} ਨਹੀਂ ਮਿਲਿਆ",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "ਆਪਣੇ ਮਾਡਲ ਦਾ ਨਾਮ ਦੱਸੋ",
|
||||
"New Chat": "ਨਵੀਂ ਗੱਲਬਾਤ",
|
||||
"New Password": "ਨਵਾਂ ਪਾਸਵਰਡ",
|
||||
"No documents found": "",
|
||||
"No results found": "ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਮਿਲੇ",
|
||||
"No search query generated": "ਕੋਈ ਖੋਜ ਪੁੱਛਗਿੱਛ ਤਿਆਰ ਨਹੀਂ ਕੀਤੀ ਗਈ",
|
||||
"No source available": "ਕੋਈ ਸਰੋਤ ਉਪਲਬਧ ਨਹੀਂ",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "ਓਲਾਮਾ",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API ਅਸਮਰੱਥ",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "ਓਲਾਮਾ ਵਰਜਨ",
|
||||
"On": "ਚਾਲੂ",
|
||||
"Only": "ਸਿਰਫ਼",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF ਚਿੱਤਰ ਕੱਢੋ (OCR)",
|
||||
"pending": "ਬਕਾਇਆ",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚਣ ਸਮੇਂ ਆਗਿਆ ਰੱਦ ਕੀਤੀ ਗਈ: {{error}}",
|
||||
"Personalization": "ਪਰਸੋਨਲਿਸ਼ਮ",
|
||||
"Pipelines": "ਪਾਈਪਲਾਈਨਾਂ",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "ਜੋਰ ਨਾਲ ਪੜ੍ਹੋ",
|
||||
"Record voice": "ਆਵਾਜ਼ ਰਿਕਾਰਡ ਕਰੋ",
|
||||
"Redirecting you to OpenWebUI Community": "ਤੁਹਾਨੂੰ ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਵੱਲ ਰੀਡਾਇਰੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "ਜਦੋਂ ਇਹ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਸੀ ਤਾਂ ਇਨਕਾਰ ਕੀਤਾ",
|
||||
"Regenerate": "ਮੁੜ ਬਣਾਓ",
|
||||
"Release Notes": "ਰਿਲੀਜ਼ ਨੋਟਸ",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "ਰੋਜ਼ ਪਾਈਨ",
|
||||
"Rosé Pine Dawn": "ਰੋਜ਼ ਪਾਈਨ ਡਾਨ",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "ਸੰਭਾਲੋ",
|
||||
"Save & Create": "ਸੰਭਾਲੋ ਅਤੇ ਬਣਾਓ",
|
||||
"Save & Update": "ਸੰਭਾਲੋ ਅਤੇ ਅੱਪਡੇਟ ਕਰੋ",
|
||||
@@ -399,34 +427,40 @@
|
||||
"Search Documents": "ਡਾਕੂਮੈਂਟ ਖੋਜੋ",
|
||||
"Search Models": "ਖੋਜ ਮਾਡਲ",
|
||||
"Search Prompts": "ਪ੍ਰੰਪਟ ਖੋਜੋ",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "ਖੋਜ ਨਤੀਜੇ ਦੀ ਗਿਣਤੀ",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "ਖੋਜਿਆ {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "ਖੋਜਿਆ {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "'{{searchQuery}}' ਲਈ ਵੈੱਬ 'ਤੇ ਖੋਜ ਕਰਨਾ",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng Query URL",
|
||||
"See readme.md for instructions": "ਹਦਾਇਤਾਂ ਲਈ readme.md ਵੇਖੋ",
|
||||
"See what's new": "ਨਵਾਂ ਕੀ ਹੈ ਵੇਖੋ",
|
||||
"Seed": "ਬੀਜ",
|
||||
"Select a base model": "ਆਧਾਰ ਮਾਡਲ ਚੁਣੋ",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "ਇੱਕ ਮੋਡ ਚੁਣੋ",
|
||||
"Select a model": "ਇੱਕ ਮਾਡਲ ਚੁਣੋ",
|
||||
"Select a pipeline": "ਪਾਈਪਲਾਈਨ ਚੁਣੋ",
|
||||
"Select a pipeline url": "ਪਾਈਪਲਾਈਨ URL ਚੁਣੋ",
|
||||
"Select an Ollama instance": "ਇੱਕ ਓਲਾਮਾ ਇੰਸਟੈਂਸ ਚੁਣੋ",
|
||||
"Select Documents": "",
|
||||
"Select model": "ਮਾਡਲ ਚੁਣੋ",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "ਚੁਣੇ ਗਏ ਮਾਡਲ(ਆਂ) ਚਿੱਤਰ ਇਨਪੁੱਟਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੇ",
|
||||
"Send": "ਭੇਜੋ",
|
||||
"Send a Message": "ਇੱਕ ਸੁਨੇਹਾ ਭੇਜੋ",
|
||||
"Send message": "ਸੁਨੇਹਾ ਭੇਜੋ",
|
||||
"September": "ਸਤੰਬਰ",
|
||||
"Serper API Key": "Serper API ਕੁੰਜੀ",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API ਕੁੰਜੀ",
|
||||
"Server connection verified": "ਸਰਵਰ ਕਨੈਕਸ਼ਨ ਦੀ ਪੁਸ਼ਟੀ ਕੀਤੀ ਗਈ",
|
||||
"Set as default": "ਮੂਲ ਵਜੋਂ ਸੈੱਟ ਕਰੋ",
|
||||
"Set Default Model": "ਮੂਲ ਮਾਡਲ ਸੈੱਟ ਕਰੋ",
|
||||
"Set embedding model (e.g. {{model}})": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਸੈੱਟ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ {{model}})",
|
||||
"Set Image Size": "ਚਿੱਤਰ ਆਕਾਰ ਸੈੱਟ ਕਰੋ",
|
||||
"Set Model": "ਮਾਡਲ ਸੈੱਟ ਕਰੋ",
|
||||
"Set reranking model (e.g. {{model}})": "ਮੁੜ ਰੈਂਕਿੰਗ ਮਾਡਲ ਸੈੱਟ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ {{model}})",
|
||||
"Set Steps": "ਕਦਮ ਸੈੱਟ ਕਰੋ",
|
||||
"Set Task Model": "ਟਾਸਕ ਮਾਡਲ ਸੈੱਟ ਕਰੋ",
|
||||
@@ -450,8 +484,8 @@
|
||||
"Source": "ਸਰੋਤ",
|
||||
"Speech recognition error: {{error}}": "ਬੋਲ ਪਛਾਣ ਗਲਤੀ: {{error}}",
|
||||
"Speech-to-Text Engine": "ਬੋਲ-ਤੋਂ-ਪਾਠ ਇੰਜਣ",
|
||||
"SpeechRecognition API is not supported in this browser.": "ਇਸ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ SpeechRecognition API ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।",
|
||||
"Stop Sequence": "ਰੋਕੋ ਕ੍ਰਮ",
|
||||
"STT Model": "",
|
||||
"STT Settings": "STT ਸੈਟਿੰਗਾਂ",
|
||||
"Submit": "ਜਮ੍ਹਾਂ ਕਰੋ",
|
||||
"Subtitle (e.g. about the Roman Empire)": "ਉਪਸਿਰਲੇਖ (ਉਦਾਹਰਣ ਲਈ ਰੋਮਨ ਸਾਮਰਾਜ ਬਾਰੇ)",
|
||||
@@ -461,6 +495,7 @@
|
||||
"System": "ਸਿਸਟਮ",
|
||||
"System Prompt": "ਸਿਸਟਮ ਪ੍ਰੰਪਟ",
|
||||
"Tags": "ਟੈਗ",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "ਸਾਨੂੰ ਹੋਰ ਦੱਸੋ:",
|
||||
"Temperature": "ਤਾਪਮਾਨ",
|
||||
"Template": "ਟੈਮਪਲੇਟ",
|
||||
@@ -470,7 +505,9 @@
|
||||
"Thanks for your feedback!": "ਤੁਹਾਡੇ ਫੀਡਬੈਕ ਲਈ ਧੰਨਵਾਦ!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "ਸਕੋਰ 0.0 (0%) ਅਤੇ 1.0 (100%) ਦੇ ਵਿਚਕਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
|
||||
"Theme": "ਥੀਮ",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਤੁਹਾਡੀਆਂ ਕੀਮਤੀ ਗੱਲਾਂ ਤੁਹਾਡੇ ਬੈਕਐਂਡ ਡਾਟਾਬੇਸ ਵਿੱਚ ਸੁਰੱਖਿਅਤ ਤੌਰ 'ਤੇ ਸੰਭਾਲੀਆਂ ਗਈਆਂ ਹਨ। ਧੰਨਵਾਦ!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "ਇਹ ਸੈਟਿੰਗ ਬ੍ਰਾਊਜ਼ਰ ਜਾਂ ਡਿਵਾਈਸਾਂ ਵਿੱਚ ਸਿੰਕ ਨਹੀਂ ਹੁੰਦੀ।",
|
||||
"Thorough explanation": "ਵਿਸਥਾਰ ਨਾਲ ਵਿਆਖਿਆ",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "ਸਲਾਹ: ਹਰ ਬਦਲਾਅ ਦੇ ਬਾਅਦ ਗੱਲਬਾਤ ਇਨਪੁਟ ਵਿੱਚ ਟੈਬ ਕੀ ਦਬਾ ਕੇ ਲਗਾਤਾਰ ਕਈ ਵੈਰੀਏਬਲ ਸਲਾਟਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ।",
|
||||
@@ -482,22 +519,31 @@
|
||||
"to": "ਨੂੰ",
|
||||
"To access the available model names for downloading,": "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ ਮਾਡਲ ਨਾਮਾਂ ਤੱਕ ਪਹੁੰਚਣ ਲਈ,",
|
||||
"To access the GGUF models available for downloading,": "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ GGUF ਮਾਡਲਾਂ ਤੱਕ ਪਹੁੰਚਣ ਲਈ,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "ਗੱਲਬਾਤ ਇਨਪੁਟ ਲਈ।",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "ਅੱਜ",
|
||||
"Toggle settings": "ਸੈਟਿੰਗਾਂ ਟੌਗਲ ਕਰੋ",
|
||||
"Toggle sidebar": "ਸਾਈਡਬਾਰ ਟੌਗਲ ਕਰੋ",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "ਸਿਖਰ K",
|
||||
"Top P": "ਸਿਖਰ P",
|
||||
"Trouble accessing Ollama?": "ਓਲਾਮਾ ਤੱਕ ਪਹੁੰਚਣ ਵਿੱਚ ਮੁਸ਼ਕਲ?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "TTS ਸੈਟਿੰਗਾਂ",
|
||||
"TTS Voice": "",
|
||||
"Type": "ਕਿਸਮ",
|
||||
"Type Hugging Face Resolve (Download) URL": "Hugging Face Resolve (ਡਾਊਨਲੋਡ) URL ਟਾਈਪ ਕਰੋ",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "ਓਹੋ! {{provider}} ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ।",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "ਅਣਜਾਣ ਫਾਈਲ ਕਿਸਮ '{{file_type}}', ਪਰ ਸਧਾਰਨ ਪਾਠ ਵਜੋਂ ਸਵੀਕਾਰ ਕਰਦੇ ਹੋਏ",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ ਲਿੰਕ ਕਾਪੀ ਕਰੋ",
|
||||
"Update password": "ਪਾਸਵਰਡ ਅੱਪਡੇਟ ਕਰੋ",
|
||||
"Upload a GGUF model": "ਇੱਕ GGUF ਮਾਡਲ ਅਪਲੋਡ ਕਰੋ",
|
||||
"Upload Files": "ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "ਅਪਲੋਡ ਪ੍ਰਗਤੀ",
|
||||
"URL Mode": "URL ਮੋਡ",
|
||||
"Use '#' in the prompt input to load and select your documents.": "ਆਪਣੇ ਡਾਕੂਮੈਂਟ ਲੋਡ ਅਤੇ ਚੁਣਨ ਲਈ ਪ੍ਰੰਪਟ ਇਨਪੁਟ ਵਿੱਚ '#' ਵਰਤੋ।",
|
||||
@@ -516,6 +562,7 @@
|
||||
"Warning": "ਚੇਤਾਵਨੀ",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "ਚੇਤਾਵਨੀ: ਜੇ ਤੁਸੀਂ ਆਪਣਾ ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਅੱਪਡੇਟ ਜਾਂ ਬਦਲਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ ਸਾਰੇ ਡਾਕੂਮੈਂਟ ਮੁੜ ਆਯਾਤ ਕਰਨ ਦੀ ਲੋੜ ਹੋਵੇਗੀ।",
|
||||
"Web": "ਵੈਬ",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "ਵੈਬ ਲੋਡਰ ਸੈਟਿੰਗਾਂ",
|
||||
"Web Params": "ਵੈਬ ਪੈਰਾਮੀਟਰ",
|
||||
"Web Search": "ਵੈੱਬ ਖੋਜ",
|
||||
@@ -526,18 +573,20 @@
|
||||
"WebUI will make requests to": "ਵੈਬਯੂਆਈ ਬੇਨਤੀਆਂ ਕਰੇਗਾ",
|
||||
"What’s New in": "ਨਵਾਂ ਕੀ ਹੈ",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "ਜਦੋਂ ਇਤਿਹਾਸ ਬੰਦ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਇਸ ਬ੍ਰਾਊਜ਼ਰ 'ਤੇ ਨਵੀਆਂ ਗੱਲਾਂ ਤੁਹਾਡੇ ਕਿਸੇ ਵੀ ਜੰਤਰ 'ਤੇ ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਵਿੱਚ ਨਹੀਂ ਆਉਣਗੀਆਂ।",
|
||||
"Whisper (Local)": "ਵਿਸਪਰ (ਸਥਾਨਕ)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "ਕਾਰਜਸਥਲ",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "ਇੱਕ ਪ੍ਰੰਪਟ ਸੁਝਾਅ ਲਿਖੋ (ਉਦਾਹਰਣ ਲਈ ਤੁਸੀਂ ਕੌਣ ਹੋ?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "50 ਸ਼ਬਦਾਂ ਵਿੱਚ ਇੱਕ ਸੰਖੇਪ ਲਿਖੋ ਜੋ [ਵਿਸ਼ਾ ਜਾਂ ਕੁੰਜੀ ਸ਼ਬਦ] ਨੂੰ ਸੰਖੇਪ ਕਰਦਾ ਹੈ।",
|
||||
"Yesterday": "ਕੱਲ੍ਹ",
|
||||
"You": "ਤੁਸੀਂ",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "ਤੁਸੀਂ ਆਧਾਰ ਮਾਡਲ ਨੂੰ ਕਲੋਨ ਨਹੀਂ ਕਰ ਸਕਦੇ",
|
||||
"You have no archived conversations.": "ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ ਨਹੀਂ ਹਨ।",
|
||||
"You have shared this chat": "ਤੁਸੀਂ ਇਹ ਗੱਲਬਾਤ ਸਾਂਝੀ ਕੀਤੀ ਹੈ",
|
||||
"You're a helpful assistant.": "ਤੁਸੀਂ ਇੱਕ ਮਦਦਗਾਰ ਸਹਾਇਕ ਹੋ।",
|
||||
"You're now logged in.": "ਤੁਸੀਂ ਹੁਣ ਲੌਗ ਇਨ ਹੋ ਗਏ ਹੋ।",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "ਯੂਟਿਊਬ",
|
||||
"Youtube Loader Settings": "ਯੂਟਿਊਬ ਲੋਡਰ ਸੈਟਿੰਗਾਂ"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "użytkownik",
|
||||
"About": "O nas",
|
||||
"Account": "Konto",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Dokładna informacja",
|
||||
"Active Users": "",
|
||||
"Add": "Dodaj",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Dodaj użytkownika",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Dostosowanie tych ustawień spowoduje zastosowanie zmian uniwersalnie do wszystkich użytkowników.",
|
||||
"admin": "admin",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Panel administracyjny",
|
||||
"Admin Settings": "Ustawienia administratora",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Zaawansowane parametry",
|
||||
"Advanced Params": "Zaawansowane parametry",
|
||||
"all": "wszyscy",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Dźwięk",
|
||||
"August": "Sierpień",
|
||||
"Auto-playback response": "Odtwarzanie automatyczne odpowiedzi",
|
||||
"Auto-send input after 3 sec.": "Wysyłanie automatyczne po 3 sek.",
|
||||
"AUTOMATIC1111 Base URL": "Podstawowy adres URL AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "Podstawowy adres URL AUTOMATIC1111 jest wymagany.",
|
||||
"available!": "dostępny!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Zła odpowiedź",
|
||||
"Banners": "Banery",
|
||||
"Base Model (From)": "Model podstawowy (od)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "przed",
|
||||
"Being lazy": "Jest leniwy",
|
||||
"Brave Search API Key": "Klucz API wyszukiwania Brave",
|
||||
"Bypass SSL verification for Websites": "Pomiń weryfikację SSL dla stron webowych",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Anuluj",
|
||||
"Capabilities": "Możliwości",
|
||||
"Change Password": "Zmień hasło",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Parametry bloku",
|
||||
"Chunk Size": "Rozmiar bloku",
|
||||
"Citation": "Cytat",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Kliknij tutaj, aby uzyskać pomoc.",
|
||||
"Click here to": "Kliknij tutaj, żeby",
|
||||
"Click here to select": "Kliknij tutaj, aby wybrać",
|
||||
"Click here to select a csv file.": "Kliknij tutaj, żeby wybrać plik CSV",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Kliknij tutaj, aby wybrać dokumenty.",
|
||||
"click here.": "kliknij tutaj.",
|
||||
"Click on the user role button to change a user's role.": "Kliknij przycisk roli użytkownika, aby zmienić rolę użytkownika.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Równoczesne żądania",
|
||||
"Confirm Password": "Potwierdź hasło",
|
||||
"Connections": "Połączenia",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Zawartość",
|
||||
"Context Length": "Długość kontekstu",
|
||||
"Continue Response": "Kontynuuj odpowiedź",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Tryb rozmowy",
|
||||
"Copied shared chat URL to clipboard!": "Skopiowano URL czatu do schowka!",
|
||||
"Copy": "Kopiuj",
|
||||
"Copy last code block": "Skopiuj ostatni blok kodu",
|
||||
"Copy last response": "Skopiuj ostatnią odpowiedź",
|
||||
"Copy Link": "Kopiuj link",
|
||||
"Copying to clipboard was successful!": "Kopiowanie do schowka zakończone powodzeniem!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Utwórz zwięzłą frazę składającą się z 3-5 słów jako nagłówek dla następującego zapytania, ściśle przestrzegając limitu od 3 do 5 słów i unikając użycia słowa 'tytuł':",
|
||||
"Create a model": "Tworzenie modelu",
|
||||
"Create Account": "Utwórz konto",
|
||||
"Create new key": "Utwórz nowy klucz",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Niestandardowy",
|
||||
"Customize models for a specific purpose": "Dostosowywanie modeli do określonego celu",
|
||||
"Dark": "Ciemny",
|
||||
"Dashboard": "",
|
||||
"Database": "Baza danych",
|
||||
"December": "Grudzień",
|
||||
"Default": "Domyślny",
|
||||
"Default (Automatic1111)": "Domyślny (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Domyślny (SentenceTransformers)",
|
||||
"Default (Web API)": "Domyślny (Web API)",
|
||||
"Default Model": "Model domyślny",
|
||||
"Default model updated": "Domyślny model zaktualizowany",
|
||||
"Default Prompt Suggestions": "Domyślne sugestie promptów",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Odkryj prompt",
|
||||
"Discover, download, and explore custom prompts": "Odkryj, pobierz i eksploruj niestandardowe prompty",
|
||||
"Discover, download, and explore model presets": "Odkryj, pobierz i eksploruj ustawienia modeli",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Wyświetl nazwę użytkownika zamiast Ty w czacie",
|
||||
"Document": "Dokument",
|
||||
"Document Settings": "Ustawienia dokumentu",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "np. '30s', '10m'. Poprawne jednostki czasu to 's', 'm', 'h'.",
|
||||
"Edit": "Edytuj",
|
||||
"Edit Doc": "Edytuj dokument",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Edytuj użytkownika",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Wprowadź wynik",
|
||||
"Enter Searxng Query URL": "Wprowadź adres URL zapytania Searxng",
|
||||
"Enter Serper API Key": "Wprowadź klucz API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Wprowadź klucz API Serpstack",
|
||||
"Enter stop sequence": "Wprowadź sekwencję zatrzymania",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Wprowadź Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Wprowadź adres URL (np. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Wprowadź adres URL (np. http://localhost:11434/)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Eksportuj mapowanie dokumentów",
|
||||
"Export Models": "Eksportuj modele",
|
||||
"Export Prompts": "Eksportuj prompty",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Nie udało się utworzyć klucza API.",
|
||||
"Failed to read clipboard contents": "Nie udało się odczytać zawartości schowka",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Kara za częstotliwość",
|
||||
"General": "Ogólne",
|
||||
"General Settings": "Ogólne ustawienia",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Generowanie zapytania",
|
||||
"Generation Info": "Informacja o generacji",
|
||||
"Good Response": "Dobra odpowiedź",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Importuj mapowanie dokumentów",
|
||||
"Import Models": "Importowanie modeli",
|
||||
"Import Prompts": "Importuj prompty",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Dołącz flagę `--api` podczas uruchamiania stable-diffusion-webui",
|
||||
"Info": "Informacji",
|
||||
"Input commands": "Wprowadź komendy",
|
||||
"Install from Github URL": "Instalowanie z adresu URL usługi Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Interfejs",
|
||||
"Invalid Tag": "Nieprawidłowy tag",
|
||||
"January": "Styczeń",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "Token JWT",
|
||||
"Keep Alive": "Zachowaj łączność",
|
||||
"Keyboard shortcuts": "Skróty klawiszowe",
|
||||
"Knowledge": "",
|
||||
"Language": "Język",
|
||||
"Last Active": "Ostatnio aktywny",
|
||||
"Last Modified": "",
|
||||
"Light": "Jasny",
|
||||
"Listening...": "Nasłuchiwanie...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLMy mogą popełniać błędy. Zweryfikuj ważne informacje.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Stworzone przez społeczność OpenWebUI",
|
||||
"Make sure to enclose them with": "Upewnij się, że są one zamknięte w",
|
||||
"Manage": "",
|
||||
"Manage Models": "Zarządzaj modelami",
|
||||
"Manage Ollama Models": "Zarządzaj modelami Ollama",
|
||||
"Manage Pipelines": "Zarządzanie potokami",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' został pomyślnie pobrany.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' jest już w kolejce do pobrania.",
|
||||
"Model {{modelId}} not found": "Model {{modelId}} nie został znaleziony",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Nazwij swój model",
|
||||
"New Chat": "Nowy czat",
|
||||
"New Password": "Nowe hasło",
|
||||
"No documents found": "",
|
||||
"No results found": "Nie znaleziono rezultatów",
|
||||
"No search query generated": "Nie wygenerowano zapytania wyszukiwania",
|
||||
"No source available": "Źródło nie dostępne",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Interfejs API Ollama wyłączony",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Wersja Ollama",
|
||||
"On": "Włączony",
|
||||
"Only": "Tylko",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "Dokument PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)",
|
||||
"pending": "oczekujące",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Odmowa dostępu do mikrofonu: {{error}}",
|
||||
"Personalization": "Personalizacja",
|
||||
"Pipelines": "Rurociągów",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Czytaj na głos",
|
||||
"Record voice": "Nagraj głos",
|
||||
"Redirecting you to OpenWebUI Community": "Przekierowujemy Cię do społeczności OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Odmówił, kiedy nie powinien",
|
||||
"Regenerate": "Generuj ponownie",
|
||||
"Release Notes": "Notatki wydania",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RLT",
|
||||
"Running": "",
|
||||
"Save": "Zapisz",
|
||||
"Save & Create": "Zapisz i utwórz",
|
||||
"Save & Update": "Zapisz i zaktualizuj",
|
||||
@@ -399,36 +427,42 @@
|
||||
"Search Documents": "Szukaj dokumentów",
|
||||
"Search Models": "Szukaj modeli",
|
||||
"Search Prompts": "Szukaj promptów",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Liczba wyników wyszukiwania",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Wyszukiwano {{count}} sites_one",
|
||||
"Searched {{count}} sites_few": "Wyszukiwano {{count}} sites_few",
|
||||
"Searched {{count}} sites_many": "Wyszukiwano {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Wyszukiwano {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Wyszukiwanie w Internecie \"{{searchQuery}}\"",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Adres URL zapytania Searxng",
|
||||
"See readme.md for instructions": "Zajrzyj do readme.md po instrukcje",
|
||||
"See what's new": "Zobacz co nowego",
|
||||
"Seed": "Seed",
|
||||
"Select a base model": "Wybieranie modelu bazowego",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Wybierz tryb",
|
||||
"Select a model": "Wybierz model",
|
||||
"Select a pipeline": "Wybieranie potoku",
|
||||
"Select a pipeline url": "Wybieranie adresu URL potoku",
|
||||
"Select an Ollama instance": "Wybierz instancję Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Wybierz model",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Wybrane modele nie obsługują danych wejściowych obrazu",
|
||||
"Send": "Wyślij",
|
||||
"Send a Message": "Wyślij Wiadomość",
|
||||
"Send message": "Wyślij wiadomość",
|
||||
"September": "Wrzesień",
|
||||
"Serper API Key": "Klucz API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Klucz API Serpstack",
|
||||
"Server connection verified": "Połączenie z serwerem zweryfikowane",
|
||||
"Set as default": "Ustaw jako domyślne",
|
||||
"Set Default Model": "Ustaw domyślny model",
|
||||
"Set embedding model (e.g. {{model}})": "Ustaw model osadzania (e.g. {{model}})",
|
||||
"Set Image Size": "Ustaw rozmiar obrazu",
|
||||
"Set Model": "Ustaw model",
|
||||
"Set reranking model (e.g. {{model}})": "Ustaw zmianę rankingu modelu (e.g. {{model}})",
|
||||
"Set Steps": "Ustaw kroki",
|
||||
"Set Task Model": "Ustawianie modelu zadań",
|
||||
@@ -452,8 +486,8 @@
|
||||
"Source": "Źródło",
|
||||
"Speech recognition error: {{error}}": "Błąd rozpoznawania mowy: {{error}}",
|
||||
"Speech-to-Text Engine": "Silnik mowy na tekst",
|
||||
"SpeechRecognition API is not supported in this browser.": "API Rozpoznawania Mowy nie jest obsługiwane w tej przeglądarce.",
|
||||
"Stop Sequence": "Zatrzymaj sekwencję",
|
||||
"STT Model": "",
|
||||
"STT Settings": "Ustawienia STT",
|
||||
"Submit": "Zatwierdź",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Podtytuł (np. o Imperium Rzymskim)",
|
||||
@@ -463,6 +497,7 @@
|
||||
"System": "System",
|
||||
"System Prompt": "Prompt systemowy",
|
||||
"Tags": "Tagi",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Powiedz nam więcej",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Szablon",
|
||||
@@ -472,7 +507,9 @@
|
||||
"Thanks for your feedback!": "Dzięki za informację zwrotną!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Wynik powinien być wartością pomiędzy 0.0 (0%) a 1.0 (100%).",
|
||||
"Theme": "Motyw",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "To zapewnia, że Twoje cenne rozmowy są bezpiecznie zapisywane w bazie danych backendowej. Dziękujemy!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "To ustawienie nie synchronizuje się między przeglądarkami ani urządzeniami.",
|
||||
"Thorough explanation": "Dokładne wyjaśnienie",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Porada: Aktualizuj wiele zmiennych kolejno, naciskając klawisz tabulatora w polu wprowadzania czatu po każdej zmianie.",
|
||||
@@ -484,22 +521,31 @@
|
||||
"to": "do",
|
||||
"To access the available model names for downloading,": "Aby uzyskać dostęp do dostępnych nazw modeli do pobrania,",
|
||||
"To access the GGUF models available for downloading,": "Aby uzyskać dostęp do dostępnych modeli GGUF do pobrania,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "do pola wprowadzania czatu.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Dzisiaj",
|
||||
"Toggle settings": "Przełącz ustawienia",
|
||||
"Toggle sidebar": "Przełącz panel boczny",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Najlepsze K",
|
||||
"Top P": "Najlepsze P",
|
||||
"Trouble accessing Ollama?": "Problemy z dostępem do Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "Ustawienia TTS",
|
||||
"TTS Voice": "",
|
||||
"Type": "Typ",
|
||||
"Type Hugging Face Resolve (Download) URL": "Wprowadź adres URL do pobrania z Hugging Face",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "O nie! Wystąpił problem z połączeniem z {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Nieznany typ pliku '{{file_type}}', ale akceptowany i traktowany jako zwykły tekst",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Uaktualnij i skopiuj link",
|
||||
"Update password": "Aktualizacja hasła",
|
||||
"Upload a GGUF model": "Prześlij model GGUF",
|
||||
"Upload Files": "Prześlij pliki",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Postęp przesyłania",
|
||||
"URL Mode": "Tryb adresu URL",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Użyj '#' w polu wprowadzania polecenia, aby załadować i wybrać swoje dokumenty.",
|
||||
@@ -518,6 +564,7 @@
|
||||
"Warning": "Ostrzeżenie",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Uwaga: Jeśli uaktualnisz lub zmienisz model osadzania, będziesz musiał ponownie zaimportować wszystkie dokumenty.",
|
||||
"Web": "Sieć",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Ustawienia pobierania z sieci",
|
||||
"Web Params": "Parametry sieci",
|
||||
"Web Search": "Wyszukiwarka w Internecie",
|
||||
@@ -528,18 +575,20 @@
|
||||
"WebUI will make requests to": "Interfejs sieciowy będzie wysyłał żądania do",
|
||||
"What’s New in": "Co nowego w",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kiedy historia jest wyłączona, nowe czaty na tej przeglądarce nie będą widoczne w historii na żadnym z twoich urządzeń.",
|
||||
"Whisper (Local)": "Whisper (Lokalnie)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Obszar roboczy",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Napisz sugestię do polecenia (np. Kim jesteś?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Napisz podsumowanie w 50 słowach, które podsumowuje [temat lub słowo kluczowe].",
|
||||
"Yesterday": "Wczoraj",
|
||||
"You": "Ty",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "Nie można sklonować modelu podstawowego",
|
||||
"You have no archived conversations.": "Nie masz zarchiwizowanych rozmów.",
|
||||
"You have shared this chat": "Udostępniłeś ten czat",
|
||||
"You're a helpful assistant.": "Jesteś pomocnym asystentem.",
|
||||
"You're now logged in.": "Jesteś teraz zalogowany.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Ustawienia pobierania z Youtube"
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"a user": "um usuário",
|
||||
"About": "Sobre",
|
||||
"Account": "Conta",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Informações precisas",
|
||||
"Active Users": "",
|
||||
"Add": "Adicionar",
|
||||
@@ -29,8 +30,10 @@
|
||||
"Add User": "Adicionar Usuário",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Ajustar essas configurações aplicará alterações universalmente a todos os usuários.",
|
||||
"admin": "administrador",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Painel do Administrador",
|
||||
"Admin Settings": "Configurações do Administrador",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Parâmetros Avançados",
|
||||
"Advanced Params": "Params Avançados",
|
||||
"all": "todos",
|
||||
@@ -59,7 +62,6 @@
|
||||
"Audio": "Áudio",
|
||||
"August": "Agosto",
|
||||
"Auto-playback response": "Reprodução automática da resposta",
|
||||
"Auto-send input after 3 sec.": "Enviar entrada automaticamente após 3 segundos.",
|
||||
"AUTOMATIC1111 Base URL": "URL Base do AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "A URL Base do AUTOMATIC1111 é obrigatória.",
|
||||
"available!": "disponível!",
|
||||
@@ -67,10 +69,14 @@
|
||||
"Bad Response": "Resposta ruim",
|
||||
"Banners": "Banners",
|
||||
"Base Model (From)": "Modelo Base (De)",
|
||||
"Batch Size (num_batch)": "",
|
||||
"before": "antes",
|
||||
"Being lazy": "Ser preguiçoso",
|
||||
"Brave Search API Key": "Chave da API de pesquisa do Brave",
|
||||
"Bypass SSL verification for Websites": "Ignorar verificação SSL para sites",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Cancel": "Cancelar",
|
||||
"Capabilities": "Capacidades",
|
||||
"Change Password": "Alterar Senha",
|
||||
@@ -88,10 +94,12 @@
|
||||
"Chunk Params": "Parâmetros de Fragmento",
|
||||
"Chunk Size": "Tamanho do Fragmento",
|
||||
"Citation": "Citação",
|
||||
"Clear memory": "",
|
||||
"Click here for help.": "Clique aqui para obter ajuda.",
|
||||
"Click here to": "Clique aqui para",
|
||||
"Click here to select": "Clique aqui para selecionar",
|
||||
"Click here to select a csv file.": "Clique aqui para selecionar um arquivo csv.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select documents.": "Clique aqui para selecionar documentos.",
|
||||
"click here.": "clique aqui.",
|
||||
"Click on the user role button to change a user's role.": "Clique no botão de função do usuário para alterar a função de um usuário.",
|
||||
@@ -105,18 +113,17 @@
|
||||
"Concurrent Requests": "Solicitações simultâneas",
|
||||
"Confirm Password": "Confirmar Senha",
|
||||
"Connections": "Conexões",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Conteúdo",
|
||||
"Context Length": "Comprimento do Contexto",
|
||||
"Continue Response": "Continuar resposta",
|
||||
"Continue with {{provider}}": "",
|
||||
"Conversation Mode": "Modo de Conversa",
|
||||
"Copied shared chat URL to clipboard!": "URL de bate-papo compartilhado copiada com sucesso!",
|
||||
"Copy": "Copiar",
|
||||
"Copy last code block": "Copiar último bloco de código",
|
||||
"Copy last response": "Copiar última resposta",
|
||||
"Copy Link": "Copiar link",
|
||||
"Copying to clipboard was successful!": "Cópia para a área de transferência bem-sucedida!",
|
||||
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Crie uma frase concisa de 3 a 5 palavras como cabeçalho para a seguinte consulta, aderindo estritamente ao limite de 3 a 5 palavras e evitando o uso da palavra 'título':",
|
||||
"Create a model": "Criar um modelo",
|
||||
"Create Account": "Criar Conta",
|
||||
"Create new key": "Criar nova chave",
|
||||
@@ -128,12 +135,12 @@
|
||||
"Custom": "Personalizado",
|
||||
"Customize models for a specific purpose": "Personalizar modelos para uma finalidade específica",
|
||||
"Dark": "Escuro",
|
||||
"Dashboard": "",
|
||||
"Database": "Banco de dados",
|
||||
"December": "Dezembro",
|
||||
"Default": "Padrão",
|
||||
"Default (Automatic1111)": "Padrão (Automatic1111)",
|
||||
"Default (SentenceTransformers)": "Padrão (SentenceTransformers)",
|
||||
"Default (Web API)": "Padrão (API Web)",
|
||||
"Default Model": "Modelo padrão",
|
||||
"Default model updated": "Modelo padrão atualizado",
|
||||
"Default Prompt Suggestions": "Sugestões de Prompt Padrão",
|
||||
@@ -154,6 +161,8 @@
|
||||
"Discover a prompt": "Descobrir um prompt",
|
||||
"Discover, download, and explore custom prompts": "Descubra, baixe e explore prompts personalizados",
|
||||
"Discover, download, and explore model presets": "Descubra, baixe e explore predefinições de modelo",
|
||||
"Dismissible": "",
|
||||
"Display Emoji in Call": "",
|
||||
"Display the username instead of You in the Chat": "Exibir o nome de usuário em vez de Você no Bate-papo",
|
||||
"Document": "Documento",
|
||||
"Document Settings": "Configurações de Documento",
|
||||
@@ -170,6 +179,7 @@
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "por exemplo, '30s', '10m'. Unidades de tempo válidas são 's', 'm', 'h'.",
|
||||
"Edit": "Editar",
|
||||
"Edit Doc": "Editar Documento",
|
||||
"Edit Memory": "",
|
||||
"Edit User": "Editar Usuário",
|
||||
"Email": "E-mail",
|
||||
"Embedding Batch Size": "",
|
||||
@@ -196,8 +206,10 @@
|
||||
"Enter Score": "Digite a Pontuação",
|
||||
"Enter Searxng Query URL": "Insira a URL de consulta do Searxng",
|
||||
"Enter Serper API Key": "Digite a chave da API do Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Digite a chave da API Serpstack",
|
||||
"Enter stop sequence": "Digite a sequência de parada",
|
||||
"Enter Tavily API Key": "",
|
||||
"Enter Top K": "Digite o Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Digite a URL (por exemplo, http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Digite a URL (por exemplo, http://localhost:11434)",
|
||||
@@ -214,6 +226,8 @@
|
||||
"Export Documents Mapping": "Exportar Mapeamento de Documentos",
|
||||
"Export Models": "Modelos de Exportação",
|
||||
"Export Prompts": "Exportar Prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Falha ao criar a Chave da API.",
|
||||
"Failed to read clipboard contents": "Falha ao ler o conteúdo da área de transferência",
|
||||
"Failed to update settings": "",
|
||||
@@ -229,6 +243,7 @@
|
||||
"Frequency Penalty": "Penalidade de Frequência",
|
||||
"General": "Geral",
|
||||
"General Settings": "Configurações Gerais",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Gerando consulta de pesquisa",
|
||||
"Generation Info": "Informações de Geração",
|
||||
"Good Response": "Boa Resposta",
|
||||
@@ -249,10 +264,12 @@
|
||||
"Import Documents Mapping": "Importar Mapeamento de Documentos",
|
||||
"Import Models": "Modelos de Importação",
|
||||
"Import Prompts": "Importar Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
|
||||
"Info": "Informação",
|
||||
"Input commands": "Comandos de entrada",
|
||||
"Install from Github URL": "Instalar a partir do URL do Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Interface": "Interface",
|
||||
"Invalid Tag": "Etiqueta Inválida",
|
||||
"January": "Janeiro",
|
||||
@@ -265,14 +282,18 @@
|
||||
"JWT Token": "Token JWT",
|
||||
"Keep Alive": "Manter Vivo",
|
||||
"Keyboard shortcuts": "Atalhos de teclado",
|
||||
"Knowledge": "",
|
||||
"Language": "Idioma",
|
||||
"Last Active": "Último Ativo",
|
||||
"Last Modified": "",
|
||||
"Light": "Claro",
|
||||
"Listening...": "Ouvindo...",
|
||||
"Listening...": "",
|
||||
"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
|
||||
"Make sure to enclose them with": "Certifique-se de colocá-los entre",
|
||||
"Manage": "",
|
||||
"Manage Models": "Gerenciar Modelos",
|
||||
"Manage Ollama Models": "Gerenciar Modelos Ollama",
|
||||
"Manage Pipelines": "Gerenciar pipelines",
|
||||
@@ -289,6 +310,7 @@
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "DD/MM/YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "DD/MM/YYYY HH:mm",
|
||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi baixado com sucesso.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para download.",
|
||||
"Model {{modelId}} not found": "Modelo {{modelId}} não encontrado",
|
||||
@@ -308,6 +330,7 @@
|
||||
"Name your model": "Nomeie seu modelo",
|
||||
"New Chat": "Novo Bate-papo",
|
||||
"New Password": "Nova Senha",
|
||||
"No documents found": "",
|
||||
"No results found": "Nenhum resultado encontrado",
|
||||
"No search query generated": "Nenhuma consulta de pesquisa gerada",
|
||||
"No source available": "Nenhuma fonte disponível",
|
||||
@@ -324,6 +347,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "API Ollama desativada",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama Version": "Versão do Ollama",
|
||||
"On": "Ligado",
|
||||
"Only": "Somente",
|
||||
@@ -346,6 +370,8 @@
|
||||
"PDF document (.pdf)": "Documento PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
|
||||
"pending": "pendente",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}",
|
||||
"Personalization": "Personalização",
|
||||
"Pipelines": "Pipelines",
|
||||
@@ -368,6 +394,7 @@
|
||||
"Read Aloud": "Ler em Voz Alta",
|
||||
"Record voice": "Gravar voz",
|
||||
"Redirecting you to OpenWebUI Community": "Redirecionando você para a Comunidade OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refused when it shouldn't have": "Recusado quando não deveria",
|
||||
"Regenerate": "Regenerar",
|
||||
"Release Notes": "Notas de Lançamento",
|
||||
@@ -386,6 +413,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Salvar",
|
||||
"Save & Create": "Salvar e Criar",
|
||||
"Save & Update": "Salvar e Atualizar",
|
||||
@@ -399,35 +427,41 @@
|
||||
"Search Documents": "Pesquisar Documentos",
|
||||
"Search Models": "Modelos de Pesquisa",
|
||||
"Search Prompts": "Pesquisar Prompts",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Contagem de resultados de pesquisa",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Pesquisado {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Pesquisado {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Pesquisado {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Pesquisando na Web por '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL de consulta Searxng",
|
||||
"See readme.md for instructions": "Consulte readme.md para obter instruções",
|
||||
"See what's new": "Veja o que há de novo",
|
||||
"Seed": "Semente",
|
||||
"Select a base model": "Selecione um modelo base",
|
||||
"Select a engine": "",
|
||||
"Select a mode": "Selecione um modo",
|
||||
"Select a model": "Selecione um modelo",
|
||||
"Select a pipeline": "Selecione um pipeline",
|
||||
"Select a pipeline url": "Selecione uma URL de pipeline",
|
||||
"Select an Ollama instance": "Selecione uma instância Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Selecione um modelo",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "O(s) modelo(s) selecionado(s) não suporta(m) entrada(s) de imagem",
|
||||
"Send": "Enviar",
|
||||
"Send a Message": "Enviar uma Mensagem",
|
||||
"Send message": "Enviar mensagem",
|
||||
"September": "Setembro",
|
||||
"Serper API Key": "Chave de API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Chave de API Serpstack",
|
||||
"Server connection verified": "Conexão com o servidor verificada",
|
||||
"Set as default": "Definir como padrão",
|
||||
"Set Default Model": "Definir Modelo Padrão",
|
||||
"Set embedding model (e.g. {{model}})": "Definir modelo de vetorização (ex.: {{model}})",
|
||||
"Set Image Size": "Definir Tamanho da Imagem",
|
||||
"Set Model": "Definir Modelo",
|
||||
"Set reranking model (e.g. {{model}})": "Definir modelo de reranking (ex.: {{model}})",
|
||||
"Set Steps": "Definir Etapas",
|
||||
"Set Task Model": "Definir modelo de tarefa",
|
||||
@@ -451,8 +485,8 @@
|
||||
"Source": "Fonte",
|
||||
"Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}",
|
||||
"Speech-to-Text Engine": "Mecanismo de Fala para Texto",
|
||||
"SpeechRecognition API is not supported in this browser.": "A API SpeechRecognition não é suportada neste navegador.",
|
||||
"Stop Sequence": "Sequência de Parada",
|
||||
"STT Model": "",
|
||||
"STT Settings": "Configurações STT",
|
||||
"Submit": "Enviar",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Subtítulo (ex.: sobre o Império Romano)",
|
||||
@@ -462,6 +496,7 @@
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Prompt do Sistema",
|
||||
"Tags": "Tags",
|
||||
"Tavily API Key": "",
|
||||
"Tell us more:": "Dê-nos mais:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Modelo",
|
||||
@@ -471,7 +506,9 @@
|
||||
"Thanks for your feedback!": "Obrigado pelo seu feedback!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "O score deve ser um valor entre 0.0 (0%) e 1.0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Isso garante que suas conversas valiosas sejam salvas com segurança em seu banco de dados de backend. Obrigado!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This setting does not sync across browsers or devices.": "Esta configuração não sincroniza entre navegadores ou dispositivos.",
|
||||
"Thorough explanation": "Explicação Completa",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Dica: Atualize vários slots de variáveis consecutivamente pressionando a tecla Tab na entrada de bate-papo após cada substituição.",
|
||||
@@ -483,22 +520,31 @@
|
||||
"to": "para",
|
||||
"To access the available model names for downloading,": "Para acessar os nomes de modelo disponíveis para download,",
|
||||
"To access the GGUF models available for downloading,": "Para acessar os modelos GGUF disponíveis para download,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "para a entrada de bate-papo.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Hoje",
|
||||
"Toggle settings": "Alternar configurações",
|
||||
"Toggle sidebar": "Alternar barra lateral",
|
||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemas para acessar o Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Settings": "Configurações TTS",
|
||||
"TTS Voice": "",
|
||||
"Type": "Tipo",
|
||||
"Type Hugging Face Resolve (Download) URL": "Digite a URL do Hugging Face Resolve (Download)",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Opa! Houve um problema ao conectar-se a {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo de arquivo desconhecido '{{file_type}}', mas aceitando e tratando como texto simples",
|
||||
"Update": "",
|
||||
"Update and Copy Link": "Atualizar e Copiar Link",
|
||||
"Update password": "Atualizar senha",
|
||||
"Upload a GGUF model": "Carregar um modelo GGUF",
|
||||
"Upload Files": "Carregar arquivos",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Progresso do Carregamento",
|
||||
"URL Mode": "Modo de URL",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar seus documentos.",
|
||||
@@ -517,6 +563,7 @@
|
||||
"Warning": "Aviso",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Aviso: Se você atualizar ou alterar seu modelo de incorporação, você precisará reimportar todos os documentos.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web Loader Settings": "Configurações do Carregador da Web",
|
||||
"Web Params": "Parâmetros da Web",
|
||||
"Web Search": "Pesquisa na Web",
|
||||
@@ -527,18 +574,20 @@
|
||||
"WebUI will make requests to": "WebUI fará solicitações para",
|
||||
"What’s New in": "O que há de novo em",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando o histórico está desativado, novos bate-papos neste navegador não aparecerão em seu histórico em nenhum dos seus dispositivos.",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Workspace": "Espaço de trabalho",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Escreva uma sugestão de prompt (por exemplo, Quem é você?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Escreva um resumo em 50 palavras que resuma [tópico ou palavra-chave].",
|
||||
"Yesterday": "Ontem",
|
||||
"You": "Você",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot clone a base model": "Não é possível clonar um modelo base",
|
||||
"You have no archived conversations.": "Você não tem conversas arquivadas.",
|
||||
"You have shared this chat": "Você compartilhou esta conversa",
|
||||
"You're a helpful assistant.": "Você é um assistente útil.",
|
||||
"You're now logged in.": "Você está conectado agora.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Configurações do carregador do Youtube"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user