Unverified Commit 92d9b381 authored by Timothy Jaeryang Baek's avatar Timothy Jaeryang Baek Committed by GitHub
Browse files

Merge branch 'dev' into feat/openai-embeddings-batch

parents 0cb81633 36a66fcf
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import { user, settings } from '$lib/stores'; import { user, settings } from '$lib/stores';
import { createEventDispatcher, onMount, getContext } from 'svelte'; import { createEventDispatcher, onMount, getContext } from 'svelte';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
import Switch from '$lib/components/common/Switch.svelte';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
const i18n = getContext('i18n'); const i18n = getContext('i18n');
...@@ -13,6 +14,7 @@ ...@@ -13,6 +14,7 @@
let OpenAIUrl = ''; let OpenAIUrl = '';
let OpenAIKey = ''; let OpenAIKey = '';
let OpenAISpeaker = '';
let STTEngines = ['', 'openai']; let STTEngines = ['', 'openai'];
let STTEngine = ''; let STTEngine = '';
...@@ -20,6 +22,7 @@ ...@@ -20,6 +22,7 @@
let conversationMode = false; let conversationMode = false;
let speechAutoSend = false; let speechAutoSend = false;
let responseAutoPlayback = false; let responseAutoPlayback = false;
let nonLocalVoices = false;
let TTSEngines = ['', 'openai']; let TTSEngines = ['', 'openai'];
let TTSEngine = ''; let TTSEngine = '';
...@@ -86,14 +89,14 @@ ...@@ -86,14 +89,14 @@
url: OpenAIUrl, url: OpenAIUrl,
key: OpenAIKey, key: OpenAIKey,
model: model, model: model,
speaker: speaker speaker: OpenAISpeaker
}); });
if (res) { if (res) {
OpenAIUrl = res.OPENAI_API_BASE_URL; OpenAIUrl = res.OPENAI_API_BASE_URL;
OpenAIKey = res.OPENAI_API_KEY; OpenAIKey = res.OPENAI_API_KEY;
model = res.OPENAI_API_MODEL; model = res.OPENAI_API_MODEL;
speaker = res.OPENAI_API_VOICE; OpenAISpeaker = res.OPENAI_API_VOICE;
} }
} }
}; };
...@@ -105,6 +108,7 @@ ...@@ -105,6 +108,7 @@
STTEngine = $settings?.audio?.STTEngine ?? ''; STTEngine = $settings?.audio?.STTEngine ?? '';
TTSEngine = $settings?.audio?.TTSEngine ?? ''; TTSEngine = $settings?.audio?.TTSEngine ?? '';
nonLocalVoices = $settings.audio?.nonLocalVoices ?? false;
speaker = $settings?.audio?.speaker ?? ''; speaker = $settings?.audio?.speaker ?? '';
model = $settings?.audio?.model ?? ''; model = $settings?.audio?.model ?? '';
...@@ -122,7 +126,10 @@ ...@@ -122,7 +126,10 @@
OpenAIUrl = res.OPENAI_API_BASE_URL; OpenAIUrl = res.OPENAI_API_BASE_URL;
OpenAIKey = res.OPENAI_API_KEY; OpenAIKey = res.OPENAI_API_KEY;
model = res.OPENAI_API_MODEL; model = res.OPENAI_API_MODEL;
speaker = res.OPENAI_API_VOICE; OpenAISpeaker = res.OPENAI_API_VOICE;
if (TTSEngine === 'openai') {
speaker = OpenAISpeaker;
}
} }
} }
}); });
...@@ -138,8 +145,14 @@ ...@@ -138,8 +145,14 @@
audio: { audio: {
STTEngine: STTEngine !== '' ? STTEngine : undefined, STTEngine: STTEngine !== '' ? STTEngine : undefined,
TTSEngine: TTSEngine !== '' ? TTSEngine : undefined, TTSEngine: TTSEngine !== '' ? TTSEngine : undefined,
speaker: speaker !== '' ? speaker : undefined, speaker:
model: model !== '' ? model : undefined (TTSEngine === 'openai' ? OpenAISpeaker : speaker) !== ''
? TTSEngine === 'openai'
? OpenAISpeaker
: speaker
: undefined,
model: model !== '' ? model : undefined,
nonLocalVoices: nonLocalVoices
} }
}); });
dispatch('save'); dispatch('save');
...@@ -227,7 +240,7 @@ ...@@ -227,7 +240,7 @@
on:change={(e) => { on:change={(e) => {
if (e.target.value === 'openai') { if (e.target.value === 'openai') {
getOpenAIVoices(); getOpenAIVoices();
speaker = 'alloy'; OpenAISpeaker = 'alloy';
model = 'tts-1'; model = 'tts-1';
} else { } else {
getWebAPIVoices(); getWebAPIVoices();
...@@ -290,16 +303,27 @@ ...@@ -290,16 +303,27 @@
<select <select
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none" class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
bind:value={speaker} bind:value={speaker}
placeholder="Select a voice"
> >
<option value="" selected>{$i18n.t('Default')}</option> <option value="" selected={speaker !== ''}>{$i18n.t('Default')}</option>
{#each voices.filter((v) => v.localService === true) as voice} {#each voices.filter((v) => nonLocalVoices || v.localService === true) as voice}
<option value={voice.name} class="bg-gray-100 dark:bg-gray-700">{voice.name}</option <option
value={voice.name}
class="bg-gray-100 dark:bg-gray-700"
selected={speaker === voice.name}>{voice.name}</option
> >
{/each} {/each}
</select> </select>
</div> </div>
</div> </div>
<div class="flex items-center justify-between mb-1">
<div class="text-sm">
{$i18n.t('Allow non-local voices')}
</div>
<div class="mt-1">
<Switch bind:state={nonLocalVoices} />
</div>
</div>
</div> </div>
{:else if TTSEngine === 'openai'} {:else if TTSEngine === 'openai'}
<div> <div>
...@@ -309,7 +333,7 @@ ...@@ -309,7 +333,7 @@
<input <input
list="voice-list" list="voice-list"
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none" class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
bind:value={speaker} bind:value={OpenAISpeaker}
placeholder="Select a voice" placeholder="Select a voice"
/> />
......
<script lang="ts"> <script lang="ts">
import { models, user } from '$lib/stores'; import { models, user } from '$lib/stores';
import { createEventDispatcher, onMount, getContext } from 'svelte'; import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
import { import {
...@@ -74,13 +74,37 @@ ...@@ -74,13 +74,37 @@
}; };
const updateOpenAIHandler = async () => { const updateOpenAIHandler = async () => {
// Check if API KEYS length is same than API URLS length
if (OPENAI_API_KEYS.length !== OPENAI_API_BASE_URLS.length) {
// if there are more keys than urls, remove the extra keys
if (OPENAI_API_KEYS.length > OPENAI_API_BASE_URLS.length) {
OPENAI_API_KEYS = OPENAI_API_KEYS.slice(0, OPENAI_API_BASE_URLS.length);
}
// if there are more urls than keys, add empty keys
if (OPENAI_API_KEYS.length < OPENAI_API_BASE_URLS.length) {
const diff = OPENAI_API_BASE_URLS.length - OPENAI_API_KEYS.length;
for (let i = 0; i < diff; i++) {
OPENAI_API_KEYS.push('');
}
}
}
OPENAI_API_BASE_URLS = await updateOpenAIUrls(localStorage.token, OPENAI_API_BASE_URLS); OPENAI_API_BASE_URLS = await updateOpenAIUrls(localStorage.token, OPENAI_API_BASE_URLS);
OPENAI_API_KEYS = await updateOpenAIKeys(localStorage.token, OPENAI_API_KEYS); OPENAI_API_KEYS = await updateOpenAIKeys(localStorage.token, OPENAI_API_KEYS);
await models.set(await getModels()); await models.set(await getModels());
}; };
const updateOllamaUrlsHandler = async () => { const updateOllamaUrlsHandler = async () => {
OLLAMA_BASE_URLS = OLLAMA_BASE_URLS.filter((url) => url !== '');
console.log(OLLAMA_BASE_URLS);
if (OLLAMA_BASE_URLS.length === 0) {
ENABLE_OLLAMA_API = false;
await updateOllamaConfig(localStorage.token, ENABLE_OLLAMA_API);
toast.info($i18n.t('Ollama API disabled'));
} else {
OLLAMA_BASE_URLS = await updateOllamaUrls(localStorage.token, OLLAMA_BASE_URLS); OLLAMA_BASE_URLS = await updateOllamaUrls(localStorage.token, OLLAMA_BASE_URLS);
const ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => { const ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => {
...@@ -92,6 +116,7 @@ ...@@ -92,6 +116,7 @@
toast.success($i18n.t('Server connection verified')); toast.success($i18n.t('Server connection verified'));
await models.set(await getModels()); await models.set(await getModels());
} }
}
}; };
onMount(async () => { onMount(async () => {
...@@ -286,6 +311,10 @@ ...@@ -286,6 +311,10 @@
bind:state={ENABLE_OLLAMA_API} bind:state={ENABLE_OLLAMA_API}
on:change={async () => { on:change={async () => {
updateOllamaConfig(localStorage.token, ENABLE_OLLAMA_API); updateOllamaConfig(localStorage.token, ENABLE_OLLAMA_API);
if (OLLAMA_BASE_URLS.length === 0) {
OLLAMA_BASE_URLS = [''];
}
}} }}
/> />
</div> </div>
......
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
getOllamaUrls, getOllamaUrls,
getOllamaVersion, getOllamaVersion,
pullModel, pullModel,
cancelOllamaRequest, uploadModel,
uploadModel getOllamaConfig
} from '$lib/apis/ollama'; } from '$lib/apis/ollama';
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants'; import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
// Models // Models
let ollamaEnabled = null;
let OLLAMA_URLS = []; let OLLAMA_URLS = [];
let selectedOllamaUrlIdx: string | null = null; let selectedOllamaUrlIdx: string | null = null;
...@@ -67,12 +69,14 @@ ...@@ -67,12 +69,14 @@
console.log(model); console.log(model);
updateModelId = model.id; updateModelId = model.id;
const res = await pullModel(localStorage.token, model.id, selectedOllamaUrlIdx).catch( const [res, controller] = await pullModel(
(error) => { localStorage.token,
model.id,
selectedOllamaUrlIdx
).catch((error) => {
toast.error(error); toast.error(error);
return null; return null;
} });
);
if (res) { if (res) {
const reader = res.body const reader = res.body
...@@ -141,10 +145,12 @@ ...@@ -141,10 +145,12 @@
return; return;
} }
const res = await pullModel(localStorage.token, sanitizedModelTag, '0').catch((error) => { const [res, controller] = await pullModel(localStorage.token, sanitizedModelTag, '0').catch(
(error) => {
toast.error(error); toast.error(error);
return null; return null;
}); }
);
if (res) { if (res) {
const reader = res.body const reader = res.body
...@@ -152,6 +158,16 @@ ...@@ -152,6 +158,16 @@
.pipeThrough(splitStream('\n')) .pipeThrough(splitStream('\n'))
.getReader(); .getReader();
MODEL_DOWNLOAD_POOL.set({
...$MODEL_DOWNLOAD_POOL,
[sanitizedModelTag]: {
...$MODEL_DOWNLOAD_POOL[sanitizedModelTag],
abortController: controller,
reader,
done: false
}
});
while (true) { while (true) {
try { try {
const { value, done } = await reader.read(); const { value, done } = await reader.read();
...@@ -170,19 +186,6 @@ ...@@ -170,19 +186,6 @@
throw data.detail; throw data.detail;
} }
if (data.id) {
MODEL_DOWNLOAD_POOL.set({
...$MODEL_DOWNLOAD_POOL,
[sanitizedModelTag]: {
...$MODEL_DOWNLOAD_POOL[sanitizedModelTag],
requestId: data.id,
reader,
done: false
}
});
console.log(data);
}
if (data.status) { if (data.status) {
if (data.digest) { if (data.digest) {
let downloadProgress = 0; let downloadProgress = 0;
...@@ -416,11 +419,12 @@ ...@@ -416,11 +419,12 @@
}; };
const cancelModelPullHandler = async (model: string) => { const cancelModelPullHandler = async (model: string) => {
const { reader, requestId } = $MODEL_DOWNLOAD_POOL[model]; const { reader, abortController } = $MODEL_DOWNLOAD_POOL[model];
if (abortController) {
abortController.abort();
}
if (reader) { if (reader) {
await reader.cancel(); await reader.cancel();
await cancelOllamaRequest(localStorage.token, requestId);
delete $MODEL_DOWNLOAD_POOL[model]; delete $MODEL_DOWNLOAD_POOL[model];
MODEL_DOWNLOAD_POOL.set({ MODEL_DOWNLOAD_POOL.set({
...$MODEL_DOWNLOAD_POOL ...$MODEL_DOWNLOAD_POOL
...@@ -431,6 +435,11 @@ ...@@ -431,6 +435,11 @@
}; };
onMount(async () => { onMount(async () => {
const ollamaConfig = await getOllamaConfig(localStorage.token);
if (ollamaConfig.ENABLE_OLLAMA_API) {
ollamaEnabled = true;
await Promise.all([ await Promise.all([
(async () => { (async () => {
OLLAMA_URLS = await getOllamaUrls(localStorage.token).catch((error) => { OLLAMA_URLS = await getOllamaUrls(localStorage.token).catch((error) => {
...@@ -446,11 +455,16 @@ ...@@ -446,11 +455,16 @@
ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false); ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
})() })()
]); ]);
} else {
ollamaEnabled = false;
toast.error('Ollama API is disabled');
}
}); });
</script> </script>
<div class="flex flex-col h-full justify-between text-sm"> <div class="flex flex-col h-full justify-between text-sm">
<div class=" space-y-3 pr-1.5 overflow-y-scroll h-[24rem]"> <div class=" space-y-3 pr-1.5 overflow-y-scroll h-[24rem]">
{#if ollamaEnabled}
{#if ollamaVersion !== null} {#if ollamaVersion !== null}
<div class="space-y-2 pr-1.5"> <div class="space-y-2 pr-1.5">
<div class="text-sm font-medium">{$i18n.t('Manage Ollama Models')}</div> <div class="text-sm font-medium">{$i18n.t('Manage Ollama Models')}</div>
...@@ -725,7 +739,9 @@ ...@@ -725,7 +739,9 @@
<div class="flex w-full mb-1.5"> <div class="flex w-full mb-1.5">
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
{#if modelUploadMode === 'file'} {#if modelUploadMode === 'file'}
<div class="flex-1 {modelInputFile && modelInputFile.length > 0 ? 'mr-2' : ''}"> <div
class="flex-1 {modelInputFile && modelInputFile.length > 0 ? 'mr-2' : ''}"
>
<input <input
id="model-upload-input" id="model-upload-input"
bind:this={modelUploadInputElement} bind:this={modelUploadInputElement}
...@@ -891,5 +907,14 @@ ...@@ -891,5 +907,14 @@
</div> </div>
</div> </div>
{/if} {/if}
{:else if ollamaEnabled === false}
<div>Ollama API is disabled</div>
{:else}
<div class="flex h-full justify-center">
<div class="my-auto">
<Spinner className="size-6" />
</div>
</div>
{/if}
</div> </div>
</div> </div>
<script lang="ts">
export let className = 'size-4';
export let strokeWidth = '1.5';
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width={strokeWidth}
stroke="currentColor"
class={className}
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3"
/>
</svg>
...@@ -63,6 +63,13 @@ ...@@ -63,6 +63,13 @@
// Revoke the URL to release memory // Revoke the URL to release memory
window.URL.revokeObjectURL(url); window.URL.revokeObjectURL(url);
}; };
const downloadJSONExport = async () => {
let blob = new Blob([JSON.stringify([chat])], {
type: 'application/json'
});
saveAs(blob, `chat-export-${Date.now()}.json`);
};
</script> </script>
<Dropdown <Dropdown
...@@ -164,6 +171,14 @@ ...@@ -164,6 +171,14 @@
transition={flyAndScale} transition={flyAndScale}
sideOffset={8} sideOffset={8}
> >
<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={() => {
downloadJSONExport();
}}
>
<div class="flex items-center line-clamp-1">{$i18n.t('Export chat (.json)')}</div>
</DropdownMenu.Item>
<DropdownMenu.Item <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" 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={() => { on:click={() => {
......
...@@ -205,6 +205,10 @@ ...@@ -205,6 +205,10 @@
await archiveChatById(localStorage.token, id); await archiveChatById(localStorage.token, id);
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
}; };
const focusEdit = async (node: HTMLInputElement) => {
node.focus();
};
</script> </script>
<ShareChatModal bind:show={showShareChatModal} chatId={shareChatId} /> <ShareChatModal bind:show={showShareChatModal} chatId={shareChatId} />
...@@ -489,7 +493,11 @@ ...@@ -489,7 +493,11 @@
? 'bg-gray-100 dark:bg-gray-950' ? 'bg-gray-100 dark:bg-gray-950'
: 'group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis" : 'group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
> >
<input bind:value={chatTitle} class=" bg-transparent w-full outline-none mr-10" /> <input
use:focusEdit
bind:value={chatTitle}
class=" bg-transparent w-full outline-none mr-10"
/>
</div> </div>
{:else} {:else}
<a <a
...@@ -507,6 +515,10 @@ ...@@ -507,6 +515,10 @@
showSidebar.set(false); showSidebar.set(false);
} }
}} }}
on:dblclick={() => {
chatTitle = chat.title;
chatTitleEditId = chat.id;
}}
draggable="false" draggable="false"
> >
<div class=" flex self-center flex-1 w-full"> <div class=" flex self-center flex-1 w-full">
......
...@@ -8,7 +8,12 @@ ...@@ -8,7 +8,12 @@
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
import Modal from '$lib/components/common/Modal.svelte'; import Modal from '$lib/components/common/Modal.svelte';
import { archiveChatById, deleteChatById, getArchivedChatList } from '$lib/apis/chats'; import {
archiveChatById,
deleteChatById,
getAllArchivedChats,
getArchivedChatList
} from '$lib/apis/chats';
import Tooltip from '$lib/components/common/Tooltip.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
...@@ -38,6 +43,7 @@ ...@@ -38,6 +43,7 @@
}; };
const exportChatsHandler = async () => { const exportChatsHandler = async () => {
const chats = await getAllArchivedChats(localStorage.token);
let blob = new Blob([JSON.stringify(chats)], { let blob = new Blob([JSON.stringify(chats)], {
type: 'application/json' type: 'application/json'
}); });
......
...@@ -126,6 +126,13 @@ ...@@ -126,6 +126,13 @@
saveAs(blob, `models-export-${Date.now()}.json`); saveAs(blob, `models-export-${Date.now()}.json`);
}; };
const exportModelHandler = async (model) => {
let blob = new Blob([JSON.stringify([model])], {
type: 'application/json'
});
saveAs(blob, `${model.id}-${Date.now()}.json`);
};
const positionChangeHanlder = async () => { const positionChangeHanlder = async () => {
// Get the new order of the models // Get the new order of the models
const modelIds = Array.from(document.getElementById('model-list').children).map((child) => const modelIds = Array.from(document.getElementById('model-list').children).map((child) =>
...@@ -322,6 +329,9 @@ ...@@ -322,6 +329,9 @@
cloneHandler={() => { cloneHandler={() => {
cloneModelHandler(model); cloneModelHandler(model);
}} }}
exportHandler={() => {
exportModelHandler(model);
}}
hideHandler={() => { hideHandler={() => {
hideModelHandler(model); hideModelHandler(model);
}} }}
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
import Share from '$lib/components/icons/Share.svelte'; import Share from '$lib/components/icons/Share.svelte';
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte'; import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte'; import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte';
import ArrowDownTray from '$lib/components/icons/ArrowDownTray.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
...@@ -18,6 +19,8 @@ ...@@ -18,6 +19,8 @@
export let shareHandler: Function; export let shareHandler: Function;
export let cloneHandler: Function; export let cloneHandler: Function;
export let exportHandler: Function;
export let hideHandler: Function; export let hideHandler: Function;
export let deleteHandler: Function; export let deleteHandler: Function;
export let onClose: Function; export let onClose: Function;
...@@ -66,6 +69,17 @@ ...@@ -66,6 +69,17 @@
<div class="flex items-center">{$i18n.t('Clone')}</div> <div class="flex items-center">{$i18n.t('Clone')}</div>
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => {
exportHandler();
}}
>
<ArrowDownTray />
<div class="flex items-center">{$i18n.t('Export')}</div>
</DropdownMenu.Item>
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => { on:click={() => {
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_API_BASE_URL } from '$lib/constants'; import { OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_API_BASE_URL } from '$lib/constants';
import { WEBUI_NAME, config, user, models, settings } from '$lib/stores'; import { WEBUI_NAME, config, user, models, settings } from '$lib/stores';
import { cancelOllamaRequest, generateChatCompletion } from '$lib/apis/ollama'; import { generateChatCompletion } from '$lib/apis/ollama';
import { generateOpenAIChatCompletion } from '$lib/apis/openai'; import { generateOpenAIChatCompletion } from '$lib/apis/openai';
import { splitStream } from '$lib/utils'; import { splitStream } from '$lib/utils';
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
let selectedModelId = ''; let selectedModelId = '';
let loading = false; let loading = false;
let currentRequestId = null;
let stopResponseFlag = false; let stopResponseFlag = false;
let messagesContainerElement: HTMLDivElement; let messagesContainerElement: HTMLDivElement;
...@@ -46,14 +45,6 @@ ...@@ -46,14 +45,6 @@
} }
}; };
// const cancelHandler = async () => {
// if (currentRequestId) {
// const res = await cancelOllamaRequest(localStorage.token, currentRequestId);
// currentRequestId = null;
// loading = false;
// }
// };
const stopResponse = () => { const stopResponse = () => {
stopResponseFlag = true; stopResponseFlag = true;
console.log('stopResponse'); console.log('stopResponse');
...@@ -171,8 +162,6 @@ ...@@ -171,8 +162,6 @@
if (stopResponseFlag) { if (stopResponseFlag) {
controller.abort('User: Stop Response'); controller.abort('User: Stop Response');
} }
currentRequestId = null;
break; break;
} }
...@@ -229,7 +218,6 @@ ...@@ -229,7 +218,6 @@
loading = false; loading = false;
stopResponseFlag = false; stopResponseFlag = false;
currentRequestId = null;
} }
}; };
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -3,19 +3,19 @@ ...@@ -3,19 +3,19 @@
"(Beta)": "(Beta)", "(Beta)": "(Beta)",
"(e.g. `sh webui.sh --api`)": "(p. ex. `sh webui.sh --api`)", "(e.g. `sh webui.sh --api`)": "(p. ex. `sh webui.sh --api`)",
"(latest)": "(últim)", "(latest)": "(últim)",
"{{ models }}": "", "{{ models }}": "{{ models }}",
"{{ owner }}: You cannot delete a base model": "", "{{ owner }}: You cannot delete a base model": "{{ propietari }}: No es pot suprimir un model base",
"{{modelName}} is thinking...": "{{modelName}} està pensant...", "{{modelName}} is thinking...": "{{modelName}} està pensant...",
"{{user}}'s Chats": "{{user}}'s Chats", "{{user}}'s Chats": "{{user}}'s Chats",
"{{webUIName}} Backend Required": "Es requereix Backend de {{webUIName}}", "{{webUIName}} Backend Required": "Es requereix Backend de {{webUIName}}",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Un model de tasca s'utilitza quan es realitzen tasques com ara generar títols per a xats i consultes de cerca web",
"a user": "un usuari", "a user": "un usuari",
"About": "Sobre", "About": "Sobre",
"Account": "Compte", "Account": "Compte",
"Accurate information": "Informació precisa", "Accurate information": "Informació precisa",
"Add": "Afegir", "Add": "Afegir",
"Add a model id": "", "Add a model id": "Afegir un identificador de model",
"Add a short description about what this model does": "", "Add a short description about what this model does": "Afegiu una breu descripció sobre què fa aquest model",
"Add a short title for this prompt": "Afegeix un títol curt per aquest prompt", "Add a short title for this prompt": "Afegeix un títol curt per aquest prompt",
"Add a tag": "Afegeix una etiqueta", "Add a tag": "Afegeix una etiqueta",
"Add custom prompt": "Afegir un prompt personalitzat", "Add custom prompt": "Afegir un prompt personalitzat",
...@@ -31,12 +31,13 @@ ...@@ -31,12 +31,13 @@
"Admin Panel": "Panell d'Administració", "Admin Panel": "Panell d'Administració",
"Admin Settings": "Configuració d'Administració", "Admin Settings": "Configuració d'Administració",
"Advanced Parameters": "Paràmetres Avançats", "Advanced Parameters": "Paràmetres Avançats",
"Advanced Params": "", "Advanced Params": "Paràmetres avançats",
"all": "tots", "all": "tots",
"All Documents": "Tots els Documents", "All Documents": "Tots els Documents",
"All Users": "Tots els Usuaris", "All Users": "Tots els Usuaris",
"Allow": "Permet", "Allow": "Permet",
"Allow Chat Deletion": "Permet la Supressió del Xat", "Allow Chat Deletion": "Permet la Supressió del Xat",
"Allow non-local voices": "",
"alphanumeric characters and hyphens": "caràcters alfanumèrics i guions", "alphanumeric characters and hyphens": "caràcters alfanumèrics i guions",
"Already have an account?": "Ja tens un compte?", "Already have an account?": "Ja tens un compte?",
"an assistant": "un assistent", "an assistant": "un assistent",
...@@ -48,7 +49,7 @@ ...@@ -48,7 +49,7 @@
"API keys": "Claus de l'API", "API keys": "Claus de l'API",
"April": "Abril", "April": "Abril",
"Archive": "Arxiu", "Archive": "Arxiu",
"Archive All Chats": "", "Archive All Chats": "Arxiva tots els xats",
"Archived Chats": "Arxiu d'historial de xat", "Archived Chats": "Arxiu d'historial de xat",
"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint", "are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
"Are you sure?": "Estàs segur?", "Are you sure?": "Estàs segur?",
...@@ -63,14 +64,14 @@ ...@@ -63,14 +64,14 @@
"available!": "disponible!", "available!": "disponible!",
"Back": "Enrere", "Back": "Enrere",
"Bad Response": "Resposta Erroni", "Bad Response": "Resposta Erroni",
"Banners": "", "Banners": "Banners",
"Base Model (From)": "", "Base Model (From)": "Model base (des de)",
"before": "abans", "before": "abans",
"Being lazy": "Ser l'estupidez", "Being lazy": "Ser l'estupidez",
"Brave Search API Key": "", "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", "Bypass SSL verification for Websites": "Desactivar la verificació SSL per a l'accés a l'Internet",
"Cancel": "Cancel·la", "Cancel": "Cancel·la",
"Capabilities": "", "Capabilities": "Capacitats",
"Change Password": "Canvia la Contrasenya", "Change Password": "Canvia la Contrasenya",
"Chat": "Xat", "Chat": "Xat",
"Chat Bubble UI": "Chat Bubble UI", "Chat Bubble UI": "Chat Bubble UI",
...@@ -93,14 +94,14 @@ ...@@ -93,14 +94,14 @@
"Click here to select documents.": "Fes clic aquí per seleccionar documents.", "Click here to select documents.": "Fes clic aquí per seleccionar documents.",
"click here.": "fes clic aquí.", "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.", "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.",
"Clone": "", "Clone": "Clon",
"Close": "Tanca", "Close": "Tanca",
"Collection": "Col·lecció", "Collection": "Col·lecció",
"ComfyUI": "ComfyUI", "ComfyUI": "ComfyUI",
"ComfyUI Base URL": "URL base de ComfyUI", "ComfyUI Base URL": "URL base de ComfyUI",
"ComfyUI Base URL is required.": "URL base de ComfyUI és obligatòria.", "ComfyUI Base URL is required.": "URL base de ComfyUI és obligatòria.",
"Command": "Comanda", "Command": "Comanda",
"Concurrent Requests": "", "Concurrent Requests": "Sol·licituds simultànies",
"Confirm Password": "Confirma la Contrasenya", "Confirm Password": "Confirma la Contrasenya",
"Connections": "Connexions", "Connections": "Connexions",
"Content": "Contingut", "Content": "Contingut",
...@@ -114,7 +115,7 @@ ...@@ -114,7 +115,7 @@
"Copy Link": "Copiar l'enllaç", "Copy Link": "Copiar l'enllaç",
"Copying to clipboard was successful!": "La còpia al porta-retalls ha estat exitosa!", "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 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": "", "Create a model": "Crear un model",
"Create Account": "Crea un Compte", "Create Account": "Crea un Compte",
"Create new key": "Crea una nova clau", "Create new key": "Crea una nova clau",
"Create new secret key": "Crea una nova clau secreta", "Create new secret key": "Crea una nova clau secreta",
...@@ -123,7 +124,7 @@ ...@@ -123,7 +124,7 @@
"Current Model": "Model Actual", "Current Model": "Model Actual",
"Current Password": "Contrasenya Actual", "Current Password": "Contrasenya Actual",
"Custom": "Personalitzat", "Custom": "Personalitzat",
"Customize models for a specific purpose": "", "Customize models for a specific purpose": "Personalitzar models per a un propòsit específic",
"Dark": "Fosc", "Dark": "Fosc",
"Database": "Base de Dades", "Database": "Base de Dades",
"December": "Desembre", "December": "Desembre",
...@@ -131,24 +132,24 @@ ...@@ -131,24 +132,24 @@
"Default (Automatic1111)": "Per defecte (Automatic1111)", "Default (Automatic1111)": "Per defecte (Automatic1111)",
"Default (SentenceTransformers)": "Per defecte (SentenceTransformers)", "Default (SentenceTransformers)": "Per defecte (SentenceTransformers)",
"Default (Web API)": "Per defecte (Web API)", "Default (Web API)": "Per defecte (Web API)",
"Default Model": "", "Default Model": "Model per defecte",
"Default model updated": "Model per defecte actualitzat", "Default model updated": "Model per defecte actualitzat",
"Default Prompt Suggestions": "Suggeriments de Prompt Per Defecte", "Default Prompt Suggestions": "Suggeriments de Prompt Per Defecte",
"Default User Role": "Rol d'Usuari Per Defecte", "Default User Role": "Rol d'Usuari Per Defecte",
"delete": "esborra", "delete": "esborra",
"Delete": "Esborra", "Delete": "Esborra",
"Delete a model": "Esborra un model", "Delete a model": "Esborra un model",
"Delete All Chats": "", "Delete All Chats": "Suprimir tots els xats",
"Delete chat": "Esborra xat", "Delete chat": "Esborra xat",
"Delete Chat": "Esborra Xat", "Delete Chat": "Esborra Xat",
"delete this link": "Esborra aquest enllaç", "delete this link": "Esborra aquest enllaç",
"Delete User": "Esborra Usuari", "Delete User": "Esborra Usuari",
"Deleted {{deleteModelTag}}": "Esborrat {{deleteModelTag}}", "Deleted {{deleteModelTag}}": "Esborrat {{deleteModelTag}}",
"Deleted {{name}}": "", "Deleted {{name}}": "Suprimit {{nom}}",
"Description": "Descripció", "Description": "Descripció",
"Didn't fully follow instructions": "No s'ha completat els instruccions", "Didn't fully follow instructions": "No s'ha completat els instruccions",
"Disabled": "Desactivat", "Disabled": "Desactivat",
"Discover a model": "", "Discover a model": "Descobreix un model",
"Discover a prompt": "Descobreix un prompt", "Discover a prompt": "Descobreix un prompt",
"Discover, download, and explore custom prompts": "Descobreix, descarrega i explora prompts personalitzats", "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", "Discover, download, and explore model presets": "Descobreix, descarrega i explora presets de models",
...@@ -174,27 +175,27 @@ ...@@ -174,27 +175,27 @@
"Embedding Model Engine": "Motor de model d'embutiment", "Embedding Model Engine": "Motor de model d'embutiment",
"Embedding model set to \"{{embedding_model}}\"": "Model d'embutiment configurat a \"{{embedding_model}}\"", "Embedding model set to \"{{embedding_model}}\"": "Model d'embutiment configurat a \"{{embedding_model}}\"",
"Enable Chat History": "Activa Historial de Xat", "Enable Chat History": "Activa Historial de Xat",
"Enable Community Sharing": "", "Enable Community Sharing": "Activar l'ús compartit de la comunitat",
"Enable New Sign Ups": "Permet Noves Inscripcions", "Enable New Sign Ups": "Permet Noves Inscripcions",
"Enable Web Search": "", "Enable Web Search": "Activa la cerca web",
"Enabled": "Activat", "Enabled": "Activat",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que el fitxer CSV inclou 4 columnes en aquest ordre: Nom, Correu Electrònic, Contrasenya, Rol.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que el fitxer CSV inclou 4 columnes en aquest ordre: Nom, Correu Electrònic, Contrasenya, Rol.",
"Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}", "Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}",
"Enter a detail about yourself for your LLMs to recall": "Introdueix un detall sobre tu per que els LLMs puguin recordar-te", "Enter a detail about yourself for your LLMs to recall": "Introdueix un detall sobre tu per que els LLMs puguin recordar-te",
"Enter Brave Search API Key": "", "Enter Brave Search API Key": "Introduïu la clau de l'API Brave Search",
"Enter Chunk Overlap": "Introdueix el Solapament de Blocs", "Enter Chunk Overlap": "Introdueix el Solapament de Blocs",
"Enter Chunk Size": "Introdueix la Mida del Bloc", "Enter Chunk Size": "Introdueix la Mida del Bloc",
"Enter Github Raw URL": "", "Enter Github Raw URL": "Introduïu l'URL en brut de Github",
"Enter Google PSE API Key": "", "Enter Google PSE API Key": "Introduïu la clau de l'API de Google PSE",
"Enter Google PSE Engine Id": "", "Enter Google PSE Engine Id": "Introduïu l'identificador del motor PSE de Google",
"Enter Image Size (e.g. 512x512)": "Introdueix la Mida de la Imatge (p. ex. 512x512)", "Enter Image Size (e.g. 512x512)": "Introdueix la Mida de la Imatge (p. ex. 512x512)",
"Enter language codes": "Introdueix els codis de llenguatge", "Enter language codes": "Introdueix els codis de llenguatge",
"Enter model tag (e.g. {{modelTag}})": "Introdueix l'etiqueta del model (p. ex. {{modelTag}})", "Enter model tag (e.g. {{modelTag}})": "Introdueix l'etiqueta del model (p. ex. {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Introdueix el Nombre de Passos (p. ex. 50)", "Enter Number of Steps (e.g. 50)": "Introdueix el Nombre de Passos (p. ex. 50)",
"Enter Score": "Introdueix el Puntuació", "Enter Score": "Introdueix el Puntuació",
"Enter Searxng Query URL": "", "Enter Searxng Query URL": "Introduïu l'URL de consulta de Searxng",
"Enter Serper API Key": "", "Enter Serper API Key": "Introduïu la clau de l'API Serper",
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "Introduïu la clau de l'API Serpstack",
"Enter stop sequence": "Introdueix la seqüència de parada", "Enter stop sequence": "Introdueix la seqüència de parada",
"Enter Top K": "Introdueix Top K", "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://127.0.0.1:7860/)": "Introdueix l'URL (p. ex. http://127.0.0.1:7860/)",
...@@ -203,12 +204,14 @@ ...@@ -203,12 +204,14 @@
"Enter Your Full Name": "Introdueix el Teu Nom Complet", "Enter Your Full Name": "Introdueix el Teu Nom Complet",
"Enter Your Password": "Introdueix la Teva Contrasenya", "Enter Your Password": "Introdueix la Teva Contrasenya",
"Enter Your Role": "Introdueix el Teu Ròl", "Enter Your Role": "Introdueix el Teu Ròl",
"Error": "", "Error": "Error",
"Experimental": "Experimental", "Experimental": "Experimental",
"Export": "Exportar",
"Export All Chats (All Users)": "Exporta Tots els Xats (Tots els Usuaris)", "Export All Chats (All Users)": "Exporta Tots els Xats (Tots els Usuaris)",
"Export chat (.json)": "",
"Export Chats": "Exporta Xats", "Export Chats": "Exporta Xats",
"Export Documents Mapping": "Exporta el Mapatge de Documents", "Export Documents Mapping": "Exporta el Mapatge de Documents",
"Export Models": "", "Export Models": "Models d'exportació",
"Export Prompts": "Exporta Prompts", "Export Prompts": "Exporta Prompts",
"Failed to create API Key.": "No s'ha pogut crear la clau d'API.", "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 read clipboard contents": "No s'ha pogut llegir el contingut del porta-retalls",
...@@ -221,15 +224,15 @@ ...@@ -221,15 +224,15 @@
"Focus chat input": "Enfoca l'entrada del xat", "Focus chat input": "Enfoca l'entrada del xat",
"Followed instructions perfectly": "Siguiu les instruccions perfeicte", "Followed instructions perfectly": "Siguiu les instruccions perfeicte",
"Format your variables using square brackets like this:": "Formata les teves variables utilitzant claudàtors així:", "Format your variables using square brackets like this:": "Formata les teves variables utilitzant claudàtors així:",
"Frequency Penalty": "", "Frequency Penalty": "Pena de freqüència",
"Full Screen Mode": "Mode de Pantalla Completa", "Full Screen Mode": "Mode de Pantalla Completa",
"General": "General", "General": "General",
"General Settings": "Configuració General", "General Settings": "Configuració General",
"Generating search query": "", "Generating search query": "Generació de consultes de cerca",
"Generation Info": "Informació de Generació", "Generation Info": "Informació de Generació",
"Good Response": "Resposta bona", "Good Response": "Resposta bona",
"Google PSE API Key": "", "Google PSE API Key": "Clau de l'API PSE de Google",
"Google PSE Engine Id": "", "Google PSE Engine Id": "Identificador del motor PSE de Google",
"h:mm a": "h:mm a", "h:mm a": "h:mm a",
"has no conversations.": "no té converses.", "has no conversations.": "no té converses.",
"Hello, {{name}}": "Hola, {{name}}", "Hello, {{name}}": "Hola, {{name}}",
...@@ -243,18 +246,18 @@ ...@@ -243,18 +246,18 @@
"Images": "Imatges", "Images": "Imatges",
"Import Chats": "Importa Xats", "Import Chats": "Importa Xats",
"Import Documents Mapping": "Importa el Mapa de Documents", "Import Documents Mapping": "Importa el Mapa de Documents",
"Import Models": "", "Import Models": "Models d'importació",
"Import Prompts": "Importa Prompts", "Import Prompts": "Importa Prompts",
"Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui",
"Info": "", "Info": "Informació",
"Input commands": "Entra ordres", "Input commands": "Entra ordres",
"Install from Github URL": "", "Install from Github URL": "Instal·leu des de l'URL de Github",
"Interface": "Interfície", "Interface": "Interfície",
"Invalid Tag": "Etiqueta Inválida", "Invalid Tag": "Etiqueta Inválida",
"January": "Gener", "January": "Gener",
"join our Discord for help.": "uneix-te al nostre Discord per ajuda.", "join our Discord for help.": "uneix-te al nostre Discord per ajuda.",
"JSON": "JSON", "JSON": "JSON",
"JSON Preview": "", "JSON Preview": "Vista prèvia de JSON",
"July": "Juliol", "July": "Juliol",
"June": "Juny", "June": "Juny",
"JWT Expiration": "Expiració de JWT", "JWT Expiration": "Expiració de JWT",
...@@ -271,9 +274,9 @@ ...@@ -271,9 +274,9 @@
"Make sure to enclose them with": "Assegura't d'envoltar-los amb", "Make sure to enclose them with": "Assegura't d'envoltar-los amb",
"Manage Models": "Gestiona Models", "Manage Models": "Gestiona Models",
"Manage Ollama Models": "Gestiona Models Ollama", "Manage Ollama Models": "Gestiona Models Ollama",
"Manage Pipelines": "", "Manage Pipelines": "Gestionar canonades",
"March": "Març", "March": "Març",
"Max Tokens (num_predict)": "", "Max Tokens (num_predict)": "Max Fitxes (num_predict)",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.",
"May": "Maig", "May": "Maig",
"Memories accessible by LLMs will be shown here.": "Els memòries accessible per a LLMs es mostraran aquí.", "Memories accessible by LLMs will be shown here.": "Els memòries accessible per a LLMs es mostraran aquí.",
...@@ -288,12 +291,12 @@ ...@@ -288,12 +291,12 @@
"Model '{{modelName}}' has been successfully downloaded.": "El model '{{modelName}}' s'ha descarregat amb èxit.", "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 '{{modelTag}}' is already in queue for downloading.": "El model '{{modelTag}}' ja està en cua per ser descarregat.",
"Model {{modelId}} not found": "Model {{modelId}} no trobat", "Model {{modelId}} not found": "Model {{modelId}} no trobat",
"Model {{modelName}} is not vision capable": "", "Model {{modelName}} is not vision capable": "El model {{modelName}} no és capaç de visió",
"Model {{name}} is now {{status}}": "", "Model {{name}} is now {{status}}": "El model {{nom}} ara és {{estat}}",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "S'ha detectat el camí del sistema de fitxers del model. És necessari un nom curt del model per a actualitzar, no es pot continuar.", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "S'ha detectat el camí del sistema de fitxers del model. És necessari un nom curt del model per a actualitzar, no es pot continuar.",
"Model ID": "", "Model ID": "Identificador del model",
"Model not selected": "Model no seleccionat", "Model not selected": "Model no seleccionat",
"Model Params": "", "Model Params": "Paràmetres del model",
"Model Whitelisting": "Llista Blanca de Models", "Model Whitelisting": "Llista Blanca de Models",
"Model(s) Whitelisted": "Model(s) a la Llista Blanca", "Model(s) Whitelisted": "Model(s) a la Llista Blanca",
"Modelfile Content": "Contingut del Fitxer de Model", "Modelfile Content": "Contingut del Fitxer de Model",
...@@ -301,23 +304,25 @@ ...@@ -301,23 +304,25 @@
"More": "Més", "More": "Més",
"Name": "Nom", "Name": "Nom",
"Name Tag": "Etiqueta de Nom", "Name Tag": "Etiqueta de Nom",
"Name your model": "", "Name your model": "Posa un nom al model",
"New Chat": "Xat Nou", "New Chat": "Xat Nou",
"New Password": "Nova Contrasenya", "New Password": "Nova Contrasenya",
"No results found": "No s'han trobat resultats", "No results found": "No s'han trobat resultats",
"No search query generated": "", "No search query generated": "No es genera cap consulta de cerca",
"No source available": "Sense font disponible", "No source available": "Sense font disponible",
"None": "", "None": "Cap",
"Not factually correct": "No està clarament correcte", "Not factually correct": "No està clarament correcte",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si establiscs una puntuació mínima, la cerca només retornarà documents amb una puntuació major o igual a la puntuació mínima.", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si establiscs una puntuació mínima, la cerca només retornarà documents amb una puntuació major o igual a la puntuació mínima.",
"Notifications": "Notificacions d'Escriptori", "Notifications": "Notificacions d'Escriptori",
"November": "Novembre", "November": "Novembre",
"num_thread (Ollama)": "num_thread (Ollama)",
"October": "Octubre", "October": "Octubre",
"Off": "Desactivat", "Off": "Desactivat",
"Okay, Let's Go!": "D'acord, Anem!", "Okay, Let's Go!": "D'acord, Anem!",
"OLED Dark": "OLED Fosc", "OLED Dark": "OLED Fosc",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama API": "", "Ollama API": "API d'Ollama",
"Ollama API disabled": "L'API d'Ollama desactivada",
"Ollama Version": "Versió d'Ollama", "Ollama Version": "Versió d'Ollama",
"On": "Activat", "On": "Activat",
"Only": "Només", "Only": "Només",
...@@ -342,8 +347,8 @@ ...@@ -342,8 +347,8 @@
"pending": "pendent", "pending": "pendent",
"Permission denied when accessing microphone: {{error}}": "Permís denegat en accedir al micròfon: {{error}}", "Permission denied when accessing microphone: {{error}}": "Permís denegat en accedir al micròfon: {{error}}",
"Personalization": "Personalització", "Personalization": "Personalització",
"Pipelines": "", "Pipelines": "Canonades",
"Pipelines Valves": "", "Pipelines Valves": "Vàlvules de canonades",
"Plain text (.txt)": "Text pla (.txt)", "Plain text (.txt)": "Text pla (.txt)",
"Playground": "Zona de Jocs", "Playground": "Zona de Jocs",
"Positive attitude": "Attitudin positiva", "Positive attitude": "Attitudin positiva",
...@@ -388,33 +393,33 @@ ...@@ -388,33 +393,33 @@
"Scan for documents from {{path}}": "Escaneja documents des de {{path}}", "Scan for documents from {{path}}": "Escaneja documents des de {{path}}",
"Search": "Cerca", "Search": "Cerca",
"Search a model": "Cerca un model", "Search a model": "Cerca un model",
"Search Chats": "", "Search Chats": "Cercar xats",
"Search Documents": "Cerca Documents", "Search Documents": "Cerca Documents",
"Search Models": "", "Search Models": "Models de cerca",
"Search Prompts": "Cerca Prompts", "Search Prompts": "Cerca Prompts",
"Search Result Count": "", "Search Result Count": "Recompte de resultats de cerca",
"Searched {{count}} sites_one": "", "Searched {{count}} sites_one": "Cercat {{count}} sites_one",
"Searched {{count}} sites_many": "", "Searched {{count}} sites_many": "Cercat {{recompte}} sites_many",
"Searched {{count}} sites_other": "", "Searched {{count}} sites_other": "Cercat {{recompte}} sites_other",
"Searching the web for '{{searchQuery}}'": "", "Searching the web for '{{searchQuery}}'": "Cerca a la web de '{{searchQuery}}'",
"Searxng Query URL": "", "Searxng Query URL": "Searxng URL de consulta",
"See readme.md for instructions": "Consulta el readme.md per a instruccions", "See readme.md for instructions": "Consulta el readme.md per a instruccions",
"See what's new": "Veure novetats", "See what's new": "Veure novetats",
"Seed": "Llavor", "Seed": "Llavor",
"Select a base model": "", "Select a base model": "Seleccionar un model base",
"Select a mode": "Selecciona un mode", "Select a mode": "Selecciona un mode",
"Select a model": "Selecciona un model", "Select a model": "Selecciona un model",
"Select a pipeline": "", "Select a pipeline": "Seleccioneu una canonada",
"Select a pipeline url": "", "Select a pipeline url": "Seleccionar un URL de canonada",
"Select an Ollama instance": "Selecciona una instància d'Ollama", "Select an Ollama instance": "Selecciona una instància d'Ollama",
"Select model": "Selecciona un model", "Select model": "Selecciona un model",
"Selected model(s) do not support image inputs": "", "Selected model(s) do not support image inputs": "Els models seleccionats no admeten l'entrada d'imatges",
"Send": "Envia", "Send": "Envia",
"Send a Message": "Envia un Missatge", "Send a Message": "Envia un Missatge",
"Send message": "Envia missatge", "Send message": "Envia missatge",
"September": "Setembre", "September": "Setembre",
"Serper API Key": "", "Serper API Key": "Clau API Serper",
"Serpstack API Key": "", "Serpstack API Key": "Serpstack API Key",
"Server connection verified": "Connexió al servidor verificada", "Server connection verified": "Connexió al servidor verificada",
"Set as default": "Estableix com a predeterminat", "Set as default": "Estableix com a predeterminat",
"Set Default Model": "Estableix Model Predeterminat", "Set Default Model": "Estableix Model Predeterminat",
...@@ -423,7 +428,7 @@ ...@@ -423,7 +428,7 @@
"Set Model": "Estableix Model", "Set Model": "Estableix Model",
"Set reranking model (e.g. {{model}})": "Estableix el model de reranking (p.ex. {{model}})", "Set reranking model (e.g. {{model}})": "Estableix el model de reranking (p.ex. {{model}})",
"Set Steps": "Estableix Passos", "Set Steps": "Estableix Passos",
"Set Task Model": "", "Set Task Model": "Defineix el model de tasca",
"Set Voice": "Estableix Veu", "Set Voice": "Estableix Veu",
"Settings": "Configuracions", "Settings": "Configuracions",
"Settings saved successfully!": "Configuracions guardades amb èxit!", "Settings saved successfully!": "Configuracions guardades amb èxit!",
...@@ -482,19 +487,21 @@ ...@@ -482,19 +487,21 @@
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Problemes accedint a Ollama?", "Trouble accessing Ollama?": "Problemes accedint a Ollama?",
"TTS Settings": "Configuracions TTS", "TTS Settings": "Configuracions TTS",
"Type": "", "Type": "Tipus",
"Type Hugging Face Resolve (Download) URL": "Escriu URL de Resolució (Descàrrega) de Hugging Face", "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}}.", "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", "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 and Copy Link": "Actualitza i Copia enllaç", "Update and Copy Link": "Actualitza i Copia enllaç",
"Update password": "Actualitza contrasenya", "Update password": "Actualitza contrasenya",
"Upload a GGUF model": "Puja un model GGUF", "Upload a GGUF model": "Puja un model GGUF",
"Upload Files": "", "Upload Files": "Pujar fitxers",
"Upload Progress": "Progrés de Càrrega", "Upload Progress": "Progrés de Càrrega",
"URL Mode": "Mode URL", "URL Mode": "Mode URL",
"Use '#' in the prompt input to load and select your documents.": "Utilitza '#' a l'entrada del prompt per carregar i seleccionar els teus documents.", "Use '#' in the prompt input to load and select your documents.": "Utilitza '#' a l'entrada del prompt per carregar i seleccionar els teus documents.",
"Use Gravatar": "Utilitza Gravatar", "Use Gravatar": "Utilitza Gravatar",
"Use Initials": "Utilitza Inicials", "Use Initials": "Utilitza Inicials",
"use_mlock (Ollama)": "use_mlock (Ollama)",
"use_mmap (Ollama)": "use_mmap (Ollama)",
"user": "usuari", "user": "usuari",
"User Permissions": "Permisos d'Usuari", "User Permissions": "Permisos d'Usuari",
"Users": "Usuaris", "Users": "Usuaris",
...@@ -503,13 +510,13 @@ ...@@ -503,13 +510,13 @@
"variable": "variable", "variable": "variable",
"variable to have them replaced with clipboard content.": "variable per tenir-les reemplaçades amb el contingut del porta-retalls.", "variable to have them replaced with clipboard content.": "variable per tenir-les reemplaçades amb el contingut del porta-retalls.",
"Version": "Versió", "Version": "Versió",
"Warning": "", "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.", "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": "Web",
"Web Loader Settings": "Configuració del carregador web", "Web Loader Settings": "Configuració del carregador web",
"Web Params": "Paràmetres web", "Web Params": "Paràmetres web",
"Web Search": "", "Web Search": "Cercador web",
"Web Search Engine": "", "Web Search Engine": "Cercador web",
"Webhook URL": "URL del webhook", "Webhook URL": "URL del webhook",
"WebUI Add-ons": "Complements de WebUI", "WebUI Add-ons": "Complements de WebUI",
"WebUI Settings": "Configuració de WebUI", "WebUI Settings": "Configuració de WebUI",
...@@ -522,7 +529,7 @@ ...@@ -522,7 +529,7 @@
"Write a summary in 50 words that summarizes [topic or keyword].": "Escriu un resum en 50 paraules que resumeixi [tema o paraula clau].", "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", "Yesterday": "Ayer",
"You": "Tu", "You": "Tu",
"You cannot clone a base model": "", "You cannot clone a base model": "No es pot clonar un model base",
"You have no archived conversations.": "No tens converses arxivades.", "You have no archived conversations.": "No tens converses arxivades.",
"You have shared this chat": "Has compartit aquest xat", "You have shared this chat": "Has compartit aquest xat",
"You're a helpful assistant.": "Ets un assistent útil.", "You're a helpful assistant.": "Ets un assistent útil.",
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
"All Users": "Ang tanan nga mga tiggamit", "All Users": "Ang tanan nga mga tiggamit",
"Allow": "Sa pagtugot", "Allow": "Sa pagtugot",
"Allow Chat Deletion": "Tugoti nga mapapas ang mga chat", "Allow Chat Deletion": "Tugoti nga mapapas ang mga chat",
"Allow non-local voices": "",
"alphanumeric characters and hyphens": "alphanumeric nga mga karakter ug hyphen", "alphanumeric characters and hyphens": "alphanumeric nga mga karakter ug hyphen",
"Already have an account?": "Naa na kay account ?", "Already have an account?": "Naa na kay account ?",
"an assistant": "usa ka katabang", "an assistant": "usa ka katabang",
...@@ -205,7 +206,9 @@ ...@@ -205,7 +206,9 @@
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
"Experimental": "Eksperimento", "Experimental": "Eksperimento",
"Export": "",
"Export All Chats (All Users)": "I-export ang tanan nga mga chat (Tanan nga tiggamit)", "Export All Chats (All Users)": "I-export ang tanan nga mga chat (Tanan nga tiggamit)",
"Export chat (.json)": "",
"Export Chats": "I-export ang mga chat", "Export Chats": "I-export ang mga chat",
"Export Documents Mapping": "I-export ang pagmapa sa dokumento", "Export Documents Mapping": "I-export ang pagmapa sa dokumento",
"Export Models": "", "Export Models": "",
...@@ -312,12 +315,14 @@ ...@@ -312,12 +315,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notifications": "Mga pahibalo sa desktop", "Notifications": "Mga pahibalo sa desktop",
"November": "", "November": "",
"num_thread (Ollama)": "",
"October": "", "October": "",
"Off": "Napuo", "Off": "Napuo",
"Okay, Let's Go!": "Okay, lakaw na!", "Okay, Let's Go!": "Okay, lakaw na!",
"OLED Dark": "", "OLED Dark": "",
"Ollama": "", "Ollama": "",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama nga bersyon", "Ollama Version": "Ollama nga bersyon",
"On": "Gipaandar", "On": "Gipaandar",
"Only": "Lamang", "Only": "Lamang",
...@@ -494,6 +499,8 @@ ...@@ -494,6 +499,8 @@
"Use '#' in the prompt input to load and select your documents.": "Gamita ang '#' sa dali nga pagsulod aron makarga ug mapili ang imong mga dokumento.", "Use '#' in the prompt input to load and select your documents.": "Gamita ang '#' sa dali nga pagsulod aron makarga ug mapili ang imong mga dokumento.",
"Use Gravatar": "Paggamit sa Gravatar", "Use Gravatar": "Paggamit sa Gravatar",
"Use Initials": "", "Use Initials": "",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "tiggamit", "user": "tiggamit",
"User Permissions": "Mga permiso sa tiggamit", "User Permissions": "Mga permiso sa tiggamit",
"Users": "Mga tiggamit", "Users": "Mga tiggamit",
......
This diff is collapsed.
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
"All Users": "All Users", "All Users": "All Users",
"Allow": "Allow", "Allow": "Allow",
"Allow Chat Deletion": "Allow Delete Chats", "Allow Chat Deletion": "Allow Delete Chats",
"Allow non-local voices": "",
"alphanumeric characters and hyphens": "so alpha, many hyphen", "alphanumeric characters and hyphens": "so alpha, many hyphen",
"Already have an account?": "Such account exists?", "Already have an account?": "Such account exists?",
"an assistant": "such assistant", "an assistant": "such assistant",
...@@ -205,7 +206,9 @@ ...@@ -205,7 +206,9 @@
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
"Experimental": "Much Experiment", "Experimental": "Much Experiment",
"Export": "",
"Export All Chats (All Users)": "Export All Chats (All Doggos)", "Export All Chats (All Users)": "Export All Chats (All Doggos)",
"Export chat (.json)": "",
"Export Chats": "Export Barks", "Export Chats": "Export Barks",
"Export Documents Mapping": "Export Mappings of Dogos", "Export Documents Mapping": "Export Mappings of Dogos",
"Export Models": "", "Export Models": "",
...@@ -312,12 +315,14 @@ ...@@ -312,12 +315,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notifications": "Notifications", "Notifications": "Notifications",
"November": "", "November": "",
"num_thread (Ollama)": "",
"October": "", "October": "",
"Off": "Off", "Off": "Off",
"Okay, Let's Go!": "Okay, Let's Go!", "Okay, Let's Go!": "Okay, Let's Go!",
"OLED Dark": "OLED Dark", "OLED Dark": "OLED Dark",
"Ollama": "", "Ollama": "",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "Ollama Version", "Ollama Version": "Ollama Version",
"On": "On", "On": "On",
"Only": "Only", "Only": "Only",
...@@ -494,6 +499,8 @@ ...@@ -494,6 +499,8 @@
"Use '#' in the prompt input to load and select your documents.": "Use '#' in the prompt input to load and select your documents. Much use.", "Use '#' in the prompt input to load and select your documents.": "Use '#' in the prompt input to load and select your documents. Much use.",
"Use Gravatar": "Use Gravatar much avatar", "Use Gravatar": "Use Gravatar much avatar",
"Use Initials": "Use Initials much initial", "Use Initials": "Use Initials much initial",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "user much user", "user": "user much user",
"User Permissions": "User Permissions much permissions", "User Permissions": "User Permissions much permissions",
"Users": "Users much users", "Users": "Users much users",
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
"All Users": "", "All Users": "",
"Allow": "", "Allow": "",
"Allow Chat Deletion": "", "Allow Chat Deletion": "",
"Allow non-local voices": "",
"alphanumeric characters and hyphens": "", "alphanumeric characters and hyphens": "",
"Already have an account?": "", "Already have an account?": "",
"an assistant": "", "an assistant": "",
...@@ -205,7 +206,9 @@ ...@@ -205,7 +206,9 @@
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
"Experimental": "", "Experimental": "",
"Export": "",
"Export All Chats (All Users)": "", "Export All Chats (All Users)": "",
"Export chat (.json)": "",
"Export Chats": "", "Export Chats": "",
"Export Documents Mapping": "", "Export Documents Mapping": "",
"Export Models": "", "Export Models": "",
...@@ -312,12 +315,14 @@ ...@@ -312,12 +315,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notifications": "", "Notifications": "",
"November": "", "November": "",
"num_thread (Ollama)": "",
"October": "", "October": "",
"Off": "", "Off": "",
"Okay, Let's Go!": "", "Okay, Let's Go!": "",
"OLED Dark": "", "OLED Dark": "",
"Ollama": "", "Ollama": "",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "", "Ollama Version": "",
"On": "", "On": "",
"Only": "", "Only": "",
...@@ -494,6 +499,8 @@ ...@@ -494,6 +499,8 @@
"Use '#' in the prompt input to load and select your documents.": "", "Use '#' in the prompt input to load and select your documents.": "",
"Use Gravatar": "", "Use Gravatar": "",
"Use Initials": "", "Use Initials": "",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "", "user": "",
"User Permissions": "", "User Permissions": "",
"Users": "", "Users": "",
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
"All Users": "", "All Users": "",
"Allow": "", "Allow": "",
"Allow Chat Deletion": "", "Allow Chat Deletion": "",
"Allow non-local voices": "",
"alphanumeric characters and hyphens": "", "alphanumeric characters and hyphens": "",
"Already have an account?": "", "Already have an account?": "",
"an assistant": "", "an assistant": "",
...@@ -205,7 +206,9 @@ ...@@ -205,7 +206,9 @@
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
"Experimental": "", "Experimental": "",
"Export": "",
"Export All Chats (All Users)": "", "Export All Chats (All Users)": "",
"Export chat (.json)": "",
"Export Chats": "", "Export Chats": "",
"Export Documents Mapping": "", "Export Documents Mapping": "",
"Export Models": "", "Export Models": "",
...@@ -312,12 +315,14 @@ ...@@ -312,12 +315,14 @@
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
"Notifications": "", "Notifications": "",
"November": "", "November": "",
"num_thread (Ollama)": "",
"October": "", "October": "",
"Off": "", "Off": "",
"Okay, Let's Go!": "", "Okay, Let's Go!": "",
"OLED Dark": "", "OLED Dark": "",
"Ollama": "", "Ollama": "",
"Ollama API": "", "Ollama API": "",
"Ollama API disabled": "",
"Ollama Version": "", "Ollama Version": "",
"On": "", "On": "",
"Only": "", "Only": "",
...@@ -494,6 +499,8 @@ ...@@ -494,6 +499,8 @@
"Use '#' in the prompt input to load and select your documents.": "", "Use '#' in the prompt input to load and select your documents.": "",
"Use Gravatar": "", "Use Gravatar": "",
"Use Initials": "", "Use Initials": "",
"use_mlock (Ollama)": "",
"use_mmap (Ollama)": "",
"user": "", "user": "",
"User Permissions": "", "User Permissions": "",
"Users": "", "Users": "",
......
This diff is collapsed.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment