Commit 715a4a6c authored by Jun Siang Cheah's avatar Jun Siang Cheah
Browse files

Merge remote-tracking branch 'upstream/dev' into feat/model-config

parents fa4c2249 120f8d77
......@@ -403,7 +403,7 @@
if (inputFiles && inputFiles.length > 0) {
inputFiles.forEach((file) => {
console.log(file, file.name.split('.').at(-1));
if (['image/gif', 'image/jpeg', 'image/png'].includes(file['type'])) {
if (['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(file['type'])) {
if (visionCapableState == 'none') {
toast.error($i18n.t('Selected models do not support image inputs'));
return;
......@@ -599,7 +599,9 @@
if (inputFiles && inputFiles.length > 0) {
const _inputFiles = Array.from(inputFiles);
_inputFiles.forEach((file) => {
if (['image/gif', 'image/jpeg', 'image/png'].includes(file['type'])) {
if (
['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(file['type'])
) {
if (visionCapableState === 'none') {
toast.error($i18n.t('Selected models do not support image inputs'));
inputFiles = null;
......@@ -1079,7 +1081,7 @@
id="send-message-button"
class="{prompt !== ''
? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 '
: 'text-white bg-gray-100 dark:text-gray-900 dark:bg-gray-800 disabled'} transition rounded-full p-1.5 self-center"
: 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 self-center"
type="submit"
disabled={prompt === ''}
>
......
<script lang="ts">
import { v4 as uuidv4 } from 'uuid';
import { chats, config, modelfiles, settings, user as _user } from '$lib/stores';
import { chats, config, modelfiles, settings, user as _user, mobile } from '$lib/stores';
import { tick, getContext } from 'svelte';
import { toast } from 'svelte-sonner';
......@@ -13,6 +13,8 @@
import Spinner from '../common/Spinner.svelte';
import { imageGenerations } from '$lib/apis/images';
import { copyToClipboard, findWordIndices } from '$lib/utils';
import CompareMessages from './Messages/CompareMessages.svelte';
import { stringify } from 'postcss';
const i18n = getContext('i18n');
......@@ -28,10 +30,10 @@
export let processing = '';
export let bottomPadding = false;
export let autoScroll;
export let selectedModels;
export let history = {};
export let messages = [];
export let selectedModels;
export let selectedModelfiles = [];
$: if (autoScroll && bottomPadding) {
......@@ -63,7 +65,8 @@
childrenIds: [],
role: 'user',
content: userPrompt,
...(history.messages[messageId].files && { files: history.messages[messageId].files })
...(history.messages[messageId].files && { files: history.messages[messageId].files }),
models: selectedModels.filter((m, mIdx) => selectedModels.indexOf(m) === mIdx)
};
let messageParentId = history.messages[messageId].parentId;
......@@ -79,7 +82,7 @@
history.currentId = userMessageId;
await tick();
await sendPrompt(userPrompt, userMessageId, chatId);
await sendPrompt(userPrompt, userMessageId);
};
const updateChatMessages = async () => {
......@@ -309,7 +312,7 @@
{showNextMessage}
copyToClipboard={copyToClipboardWithToast}
/>
{:else}
{:else if $mobile || (history.messages[message.parentId]?.models?.length ?? 1) === 1}
{#key message.id}
<ResponseMessage
{message}
......@@ -337,6 +340,37 @@
}}
/>
{/key}
{:else}
{#key message.parentId}
<CompareMessages
bind:history
{messages}
{chatId}
parentMessage={history.messages[message.parentId]}
{messageIdx}
{selectedModelfiles}
{updateChatMessages}
{confirmEditResponseMessage}
{rateMessage}
copyToClipboard={copyToClipboardWithToast}
{continueGeneration}
{regenerateResponse}
on:change={async () => {
await updateChatById(localStorage.token, chatId, {
messages: messages,
history: history
});
const element = document.getElementById('messages-container');
autoScroll =
element.scrollHeight - element.scrollTop <= element.clientHeight + 50;
setTimeout(() => {
scrollToBottom();
}, 100);
}}
/>
{/key}
{/if}
</div>
</div>
......
......@@ -5,7 +5,7 @@
import 'highlight.js/styles/github-dark.min.css';
import { loadPyodide } from 'pyodide';
import { tick } from 'svelte';
import PyodideWorker from '../../../workers/pyodide.worker?worker';
import PyodideWorker from '$lib/workers/pyodide.worker?worker';
export let id = '';
......@@ -286,7 +286,7 @@ __builtins__.input = input`);
<div class="p-1">{@html lang}</div>
<div class="flex items-center">
{#if lang === 'python' || checkPythonCode(code)}
{#if ['', 'python'].includes(lang) && (lang === 'python' || checkPythonCode(code))}
{#if executing}
<div class="copy-code-button bg-none border-none p-1 cursor-not-allowed">Running</div>
{:else}
......
<script lang="ts">
import { createEventDispatcher } from 'svelte';
import { updateChatById } from '$lib/apis/chats';
import { onMount, tick } from 'svelte';
import ResponseMessage from './ResponseMessage.svelte';
export let chatId;
export let history;
export let messages = [];
export let messageIdx;
export let parentMessage;
export let selectedModelfiles;
export let updateChatMessages: Function;
export let confirmEditResponseMessage: Function;
export let rateMessage: Function;
export let copyToClipboard: Function;
export let continueGeneration: Function;
export let regenerateResponse: Function;
const dispatch = createEventDispatcher();
let currentMessageId;
let groupedMessagesIdx = {};
let groupedMessages = {};
$: groupedMessages = parentMessage?.models.reduce((a, model) => {
const modelMessages = parentMessage?.childrenIds
.map((id) => history.messages[id])
.filter((m) => m.model === model);
return {
...a,
[model]: { messages: modelMessages }
};
}, {});
onMount(async () => {
await tick();
currentMessageId = messages[messageIdx].id;
for (const model of parentMessage?.models) {
const idx = groupedMessages[model].messages.findIndex((m) => m.id === currentMessageId);
if (idx !== -1) {
groupedMessagesIdx[model] = idx;
} else {
groupedMessagesIdx[model] = 0;
}
}
});
</script>
<div>
<div
class="flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden"
id="responses-container-{parentMessage.id}"
>
{#each Object.keys(groupedMessages) as model}
{#if groupedMessagesIdx[model] !== undefined && groupedMessages[model].messages.length > 0}
<!-- svelte-ignore a11y-no-static-element-interactions -->
<!-- svelte-ignore a11y-click-events-have-key-events -->
<div
class=" snap-center min-w-80 w-full max-w-full m-1 outline outline-1 {history.messages[
currentMessageId
].model === model
? 'outline-gray-200 dark:outline-gray-700 outline-2'
: 'outline-gray-100 dark:outline-gray-850 '} transition p-6 rounded-3xl"
on:click={() => {
currentMessageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
console.log(messageId);
let messageChildrenIds = history.messages[messageId].childrenIds;
while (messageChildrenIds.length !== 0) {
messageId = messageChildrenIds.at(-1);
messageChildrenIds = history.messages[messageId].childrenIds;
}
history.currentId = messageId;
dispatch('change');
}}
>
<ResponseMessage
message={groupedMessages[model].messages[groupedMessagesIdx[model]]}
modelfiles={selectedModelfiles}
siblings={groupedMessages[model].messages.map((m) => m.id)}
isLastMessage={true}
{updateChatMessages}
{confirmEditResponseMessage}
showPreviousMessage={() => {
groupedMessagesIdx[model] = Math.max(0, groupedMessagesIdx[model] - 1);
let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
console.log(messageId);
let messageChildrenIds = history.messages[messageId].childrenIds;
while (messageChildrenIds.length !== 0) {
messageId = messageChildrenIds.at(-1);
messageChildrenIds = history.messages[messageId].childrenIds;
}
history.currentId = messageId;
dispatch('change');
}}
showNextMessage={() => {
groupedMessagesIdx[model] = Math.min(
groupedMessages[model].messages.length - 1,
groupedMessagesIdx[model] + 1
);
let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
console.log(messageId);
let messageChildrenIds = history.messages[messageId].childrenIds;
while (messageChildrenIds.length !== 0) {
messageId = messageChildrenIds.at(-1);
messageChildrenIds = history.messages[messageId].childrenIds;
}
history.currentId = messageId;
dispatch('change');
}}
{rateMessage}
{copyToClipboard}
{continueGeneration}
regenerateResponse={async (message) => {
regenerateResponse(message);
await tick();
groupedMessagesIdx[model] = groupedMessages[model].messages.length - 1;
}}
on:save={async (e) => {
console.log('save', e);
const message = e.detail;
history.messages[message.id] = message;
await updateChatById(localStorage.token, chatId, {
messages: messages,
history: history
});
}}
/>
</div>
{/if}
{/each}
</div>
</div>
......@@ -69,7 +69,7 @@
let selectedCitation = null;
$: tokens = marked.lexer(sanitizeResponseContent(message.content));
$: tokens = marked.lexer(sanitizeResponseContent(message?.content));
const renderer = new marked.Renderer();
......@@ -499,7 +499,7 @@
class=" flex justify-start overflow-x-auto buttons text-gray-600 dark:text-gray-500"
>
{#if siblings.length > 1}
<div class="flex self-center" dir="ltr">
<div class="flex self-center min-w-fit" dir="ltr">
<button
class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition"
on:click={() => {
......@@ -523,7 +523,7 @@
</button>
<div
class="text-sm tracking-widest font-semibold self-center dark:text-gray-100"
class="text-sm tracking-widest font-semibold self-center dark:text-gray-100 min-w-fit"
>
{siblings.indexOf(message.id) + 1}/{siblings.length}
</div>
......@@ -894,7 +894,9 @@
class="{isLastMessage
? '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={regenerateResponse}
on:click={() => {
regenerateResponse(message);
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
......
......@@ -65,7 +65,7 @@
: user?.profile_image_url ?? '/user.png'}
/>
{/if}
<div class="w-full overflow-hidden">
<div class="w-full overflow-hidden pl-1">
{#if !($settings?.chatBubble ?? true)}
<div>
<Name>
......
......@@ -127,7 +127,7 @@
if (
files.length > 0 &&
['image/gif', 'image/jpeg', 'image/png'].includes(files[0]['type'])
['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(files[0]['type'])
) {
reader.readAsDataURL(files[0]);
}
......
......@@ -5,12 +5,16 @@
import { config, models, settings, user } from '$lib/stores';
import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
import { toast } from 'svelte-sonner';
import ManageModal from './Personalization/ManageModal.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
const dispatch = createEventDispatcher();
const i18n = getContext('i18n');
export let saveSettings: Function;
let showManageModal = false;
// Addons
let enableMemory = true;
......@@ -20,6 +24,8 @@
});
</script>
<ManageModal bind:show={showManageModal} />
<form
class="flex flex-col h-full justify-between space-y-3 text-sm"
on:submit|preventDefault={() => {
......@@ -29,9 +35,15 @@
<div class=" pr-1.5 overflow-y-scroll max-h-[25rem]">
<div>
<div class="flex items-center justify-between mb-1">
<div class="text-sm font-medium">
{$i18n.t('Memory')} <span class=" text-xs text-gray-500">({$i18n.t('Beta')})</span>
</div>
<Tooltip
content="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')}
<span class=" text-xs text-gray-500">({$i18n.t('Experimental')})</span>
</div>
</Tooltip>
<div class="mt-1">
<Switch
......@@ -64,6 +76,9 @@
<button
type="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"
on:click={() => {
showManageModal = true;
}}
>
Manage
</button>
......
<script>
import { getContext } from 'svelte';
import Modal from '$lib/components/common/Modal.svelte';
export let show;
const i18n = getContext('i18n');
let loading = false;
let memory = '';
const submitHandler = () => {
console.log('submitHandler');
};
</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('Add 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={memory}
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">
ⓘ 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('Add')}
{#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>
......@@ -6,7 +6,7 @@
const dispatch = createEventDispatcher();
import Modal from '$lib/components/common/Modal.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import AddMemoryModal from './AddMemoryModal.svelte';
const i18n = getContext('i18n');
......@@ -14,6 +14,8 @@
let memories = [];
let showAddMemoryModal = false;
$: if (show) {
(async () => {
// chats = await getArchivedChatList(localStorage.token);
......@@ -21,7 +23,7 @@
}
</script>
<Modal size="lg" bind:show>
<Modal size="xl" bind:show>
<div>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-1">
<div class=" text-lg font-medium self-center">{$i18n.t('Memory')}</div>
......@@ -44,9 +46,11 @@
</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">
{#if chats.length > 0}
<div class="flex flex-col w-full px-5 pb-5 dark:text-gray-200">
<div
class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6 h-[28rem] max-h-screen outline outline-1 rounded-xl outline-gray-100 dark:outline-gray-800 mb-4 mt-1"
>
{#if memories.length > 0}
<div class="text-left text-sm w-full mb-4 max-h-[22rem] overflow-y-scroll">
<div class="relative overflow-x-auto">
<table class="w-full text-sm text-left text-gray-600 dark:text-gray-400 table-auto">
......@@ -60,93 +64,52 @@
</tr>
</thead>
<tbody>
{#each chats as chat, idx}
<tr
class="bg-transparent {idx !== chats.length - 1 &&
'border-b'} dark:bg-gray-900 dark:border-gray-850 text-xs"
>
<td class="px-3 py-1 w-2/3">
<a href="/c/{chat.id}" target="_blank">
<div class=" underline line-clamp-1">
{chat.title}
</div>
</a>
{#each memories as memory}
<tr class="border-b dark:border-gray-800">
<td class="px-3 py-2"> {memory.name} </td>
<td class="px-3 py-2 hidden md:flex">
{dayjs(memory.created_at).format($i18n.t('MMMM DD, YYYY'))}
</td>
<td class=" px-3 py-1 hidden md:flex h-[2.5rem]">
<div class="my-auto">
{dayjs(chat.created_at * 1000).format($i18n.t('MMMM DD, YYYY HH:mm'))}
</div>
</td>
<td class="px-3 py-1 text-right">
<div class="flex justify-end w-full">
<Tooltip content="Unarchive Chat">
<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={async () => {
unarchiveChatHandler(chat.id);
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-4"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M9 8.25H7.5a2.25 2.25 0 0 0-2.25 2.25v9a2.25 2.25 0 0 0 2.25 2.25h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25H15m0-3-3-3m0 0-3 3m3-3V15"
/>
</svg>
</button>
</Tooltip>
<Tooltip content="Delete Chat">
<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={async () => {
deleteChatHandler(chat.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="m14.74 9-.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 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
/>
</svg>
</button>
</Tooltip>
</div>
<td class="px-3 py-2 text-right">
<button
class="text-xs text-gray-500 dark:text-gray-400"
on:click={() => {
// showMemory(memory);
}}
>
{$i18n.t('View')}
</button>
</td>
</tr>
{/each}
</tbody>
</table>
</div>
<!-- {#each chats as chat}
<div>
{JSON.stringify(chat)}
</div>
{/each} -->
</div>
{:else}
<div class="text-left text-sm w-full mb-8">
{$i18n.t('You have no archived conversations.')}
<div class="text-center flex h-full text-sm w-full">
<div class=" my-auto pb-10 px-4 w-full text-gray-500">
{$i18n.t(
'As you chat with LLMs, the details and preferences it remembers will be shown here.'
)}
</div>
</div>
{/if}
</div>
<div class="flex text-sm font-medium gap-1.5">
<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"
on:click={() => {
showAddMemoryModal = true;
}}>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"
>Clear memory</button
> -->
</div>
</div>
</div>
</Modal>
<AddMemoryModal bind:show={showAddMemoryModal} />
......@@ -18,7 +18,7 @@
} else if (size === 'md') {
return 'w-[48rem]';
} else {
return 'w-[52rem]';
return 'w-[56rem]';
}
};
......
......@@ -6,11 +6,12 @@
"{{modelName}} is thinking...": "{{modelName}} ...يفكر",
"{{user}}'s Chats": "{{user}}' الدردشات",
"{{webUIName}} Backend Required": "{{webUIName}} مطلوب",
"A selected model does not support image input": "",
"A selected model does not support image input": "",
"a user": "المستخدم",
"About": "عن",
"Account": "الحساب",
"Accurate information": "معلومات دقيقة",
"Add": "",
"Add a model": "أضافة موديل",
"Add a model tag name": "ضع تاق للأسم الموديل",
"Add a short description about what this modelfile does": "أضف وصفًا قصيرًا حول ما يفعله ملف الموديل هذا",
......@@ -19,6 +20,7 @@
"Add custom prompt": "أضافة مطالبة مخصصه",
"Add Docs": "إضافة المستندات",
"Add Files": "إضافة ملفات",
"Add Memory": "",
"Add message": "اضافة رسالة",
"Add Model": "اضافة موديل",
"Add Tags": "اضافة تاق",
......@@ -49,6 +51,7 @@
"Archived Chats": "الأرشيف المحادثات",
"are allowed - Activate this command by typing": "مسموح - قم بتنشيط هذا الأمر عن طريق الكتابة",
"Are you sure?": "هل أنت متأكد ؟",
"As you chat with LLMs, the details and preferences it remembers will be shown here.": "",
"Attach file": "أرفق ملف",
"Attention to detail": "انتبه للتفاصيل",
"Audio": "صوتي",
......@@ -62,7 +65,6 @@
"Bad Response": "استجابة خطاء",
"before": "قبل",
"Being lazy": "كون كسول",
"Beta": "",
"Builder Mode": "بناء الموديل",
"Bypass SSL verification for Websites": "",
"Cancel": "اللغاء",
......@@ -173,6 +175,7 @@
"Enabled": "تفعيل",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.",
"Enter {{role}} message here": "أدخل رسالة {{role}} هنا",
"Enter a detail about yourself for your LLMs to recall": "",
"Enter Chunk Overlap": "أدخل Chunk المتداخل",
"Enter Chunk Size": "أدخل Chunk الحجم",
"Enter Image Size (e.g. 512x512)": "(e.g. 512x512) أدخل حجم الصورة ",
......@@ -488,6 +491,7 @@
"variable": "المتغير",
"variable to have them replaced with clipboard content.": "متغير لاستبدالها بمحتوى الحافظة.",
"Version": "إصدار",
"View": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "تحذير: إذا قمت بتحديث أو تغيير نموذج التضمين الخاص بك، فستحتاج إلى إعادة استيراد كافة المستندات.",
"Web": "Web",
"Web Loader Settings": "",
......
......@@ -6,11 +6,12 @@
"{{modelName}} is thinking...": "{{modelName}} мисли ...",
"{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "{{webUIName}} Изисква се Бекенд",
"A selected model does not support image input": "",
"A selected model does not support image input": "",
"a user": "потребител",
"About": "Относно",
"Account": "Акаунт",
"Accurate information": "",
"Add": "",
"Add a model": "Добавяне на модел",
"Add a model tag name": "Добавяне на име на таг за модел",
"Add a short description about what this modelfile does": "Добавяне на кратко описание за това какво прави този модфайл",
......@@ -19,6 +20,7 @@
"Add custom prompt": "",
"Add Docs": "Добавяне на Документи",
"Add Files": "Добавяне на Файлове",
"Add Memory": "",
"Add message": "Добавяне на съобщение",
"Add Model": "",
"Add Tags": "добавяне на тагове",
......@@ -49,6 +51,7 @@
"Archived Chats": "",
"are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане",
"Are you sure?": "Сигурни ли сте?",
"As you chat with LLMs, the details and preferences it remembers will be shown here.": "",
"Attach file": "",
"Attention to detail": "",
"Audio": "Аудио",
......@@ -62,7 +65,6 @@
"Bad Response": "",
"before": "",
"Being lazy": "",
"Beta": "",
"Builder Mode": "Режим на Създаване",
"Bypass SSL verification for Websites": "",
"Cancel": "Отказ",
......@@ -173,6 +175,7 @@
"Enabled": "Включено",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Въведете съобщение за {{role}} тук",
"Enter a detail about yourself for your LLMs to recall": "",
"Enter Chunk Overlap": "Въведете Chunk Overlap",
"Enter Chunk Size": "Въведете Chunk Size",
"Enter Image Size (e.g. 512x512)": "Въведете размер на изображението (напр. 512x512)",
......@@ -488,6 +491,7 @@
"variable": "променлива",
"variable to have them replaced with clipboard content.": "променливи да се заменят съдържанието от клипборд.",
"Version": "Версия",
"View": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "Уеб",
"Web Loader Settings": "",
......
......@@ -6,11 +6,12 @@
"{{modelName}} is thinking...": "{{modelName}} চিন্তা করছে...",
"{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "{{webUIName}} ব্যাকএন্ড আবশ্যক",
"A selected model does not support image input": "",
"A selected model does not support image input": "",
"a user": "একজন ব্যাবহারকারী",
"About": "সম্পর্কে",
"Account": "একাউন্ট",
"Accurate information": "",
"Add": "",
"Add a model": "একটি মডেল যোগ করুন",
"Add a model tag name": "একটি মডেল ট্যাগ যোগ করুন",
"Add a short description about what this modelfile does": "এই মডেলফাইলটির সম্পর্কে সংক্ষিপ্ত বিবরণ যোগ করুন",
......@@ -19,6 +20,7 @@
"Add custom prompt": "",
"Add Docs": "ডকুমেন্ট যোগ করুন",
"Add Files": "ফাইল যোগ করুন",
"Add Memory": "",
"Add message": "মেসেজ যোগ করুন",
"Add Model": "",
"Add Tags": "ট্যাগ যোগ করুন",
......@@ -49,6 +51,7 @@
"Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার",
"are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন",
"Are you sure?": "আপনি নিশ্চিত?",
"As you chat with LLMs, the details and preferences it remembers will be shown here.": "",
"Attach file": "",
"Attention to detail": "",
"Audio": "অডিও",
......@@ -62,7 +65,6 @@
"Bad Response": "",
"before": "",
"Being lazy": "",
"Beta": "",
"Builder Mode": "বিল্ডার মোড",
"Bypass SSL verification for Websites": "",
"Cancel": "বাতিল",
......@@ -173,6 +175,7 @@
"Enabled": "চালু করা হয়েছে",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন",
"Enter a detail about yourself for your LLMs to recall": "",
"Enter Chunk Overlap": "চাঙ্ক ওভারল্যাপ লিখুন",
"Enter Chunk Size": "চাংক সাইজ লিখুন",
"Enter Image Size (e.g. 512x512)": "ছবির মাপ লিখুন (যেমন 512x512)",
......@@ -488,6 +491,7 @@
"variable": "ভেরিয়েবল",
"variable to have them replaced with clipboard content.": "ক্লিপবোর্ডের কন্টেন্ট দিয়ে যেই ভেরিয়েবল রিপ্লেস করা যাবে।",
"Version": "ভার্সন",
"View": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "ওয়েব",
"Web Loader Settings": "",
......
......@@ -6,11 +6,12 @@
"{{modelName}} is thinking...": "{{modelName}} està pensant...",
"{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "Es requereix Backend de {{webUIName}}",
"A selected model does not support image input": "",
"A selected model does not support image input": "",
"a user": "un usuari",
"About": "Sobre",
"Account": "Compte",
"Accurate information": "",
"Add": "",
"Add a model": "Afegeix un model",
"Add a model tag name": "Afegeix un nom d'etiqueta de model",
"Add a short description about what this modelfile does": "Afegeix una descripció curta del que fa aquest arxiu de model",
......@@ -19,6 +20,7 @@
"Add custom prompt": "",
"Add Docs": "Afegeix Documents",
"Add Files": "Afegeix Arxius",
"Add Memory": "",
"Add message": "Afegeix missatge",
"Add Model": "",
"Add Tags": "afegeix etiquetes",
......@@ -49,6 +51,7 @@
"Archived Chats": "Arxiu d'historial de xat",
"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
"Are you sure?": "Estàs segur?",
"As you chat with LLMs, the details and preferences it remembers will be shown here.": "",
"Attach file": "",
"Attention to detail": "",
"Audio": "Àudio",
......@@ -62,7 +65,6 @@
"Bad Response": "",
"before": "",
"Being lazy": "",
"Beta": "",
"Builder Mode": "Mode Constructor",
"Bypass SSL verification for Websites": "",
"Cancel": "Cancel·la",
......@@ -173,6 +175,7 @@
"Enabled": "Activat",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}",
"Enter a detail about yourself for your LLMs to recall": "",
"Enter Chunk Overlap": "Introdueix el Solapament de Blocs",
"Enter Chunk Size": "Introdueix la Mida del Bloc",
"Enter Image Size (e.g. 512x512)": "Introdueix la Mida de la Imatge (p. ex. 512x512)",
......@@ -488,6 +491,7 @@
"variable": "variable",
"variable to have them replaced with clipboard content.": "variable per tenir-les reemplaçades amb el contingut del porta-retalls.",
"Version": "Versió",
"View": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "Web",
"Web Loader Settings": "",
......
......@@ -6,11 +6,12 @@
"{{modelName}} is thinking...": "{{modelName}} denkt nach...",
"{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich",
"A selected model does not support image input": "",
"A selected model does not support image input": "",
"a user": "ein Benutzer",
"About": "Über",
"Account": "Account",
"Accurate information": "Genaue Information",
"Add": "",
"Add a model": "Füge ein Modell hinzu",
"Add a model tag name": "Benenne deinen Modell-Tag",
"Add a short description about what this modelfile does": "Füge eine kurze Beschreibung hinzu, was dieses Modelfile kann",
......@@ -19,6 +20,7 @@
"Add custom prompt": "Eigenen Prompt hinzufügen",
"Add Docs": "Dokumente hinzufügen",
"Add Files": "Dateien hinzufügen",
"Add Memory": "",
"Add message": "Nachricht eingeben",
"Add Model": "Modell hinzufügen",
"Add Tags": "Tags hinzufügen",
......@@ -49,6 +51,7 @@
"Archived Chats": "Archivierte Chats",
"are allowed - Activate this command by typing": "sind erlaubt - Aktiviere diesen Befehl, indem du",
"Are you sure?": "Bist du sicher?",
"As you chat with LLMs, the details and preferences it remembers will be shown here.": "",
"Attach file": "Datei anhängen",
"Attention to detail": "Auge fürs Detail",
"Audio": "Audio",
......@@ -62,7 +65,6 @@
"Bad Response": "Schlechte Antwort",
"before": "bereits geteilt",
"Being lazy": "Faul sein",
"Beta": "",
"Builder Mode": "Builder Modus",
"Bypass SSL verification for Websites": "Bypass SSL-Verifizierung für Websites",
"Cancel": "Abbrechen",
......@@ -173,6 +175,7 @@
"Enabled": "Aktiviert",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Gib die {{role}} Nachricht hier ein",
"Enter a detail about yourself for your LLMs to recall": "",
"Enter Chunk Overlap": "Gib den Chunk Overlap ein",
"Enter Chunk Size": "Gib die Chunk Size ein",
"Enter Image Size (e.g. 512x512)": "Gib die Bildgröße ein (z.B. 512x512)",
......@@ -488,6 +491,7 @@
"variable": "Variable",
"variable to have them replaced with clipboard content.": "Variable, um den Inhalt der Zwischenablage beim Nutzen des Prompts zu ersetzen.",
"Version": "Version",
"View": "",
"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 Loader Settings": "",
......
......@@ -6,11 +6,12 @@
"{{modelName}} is thinking...": "{{modelName}} is thinkin'...",
"{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "{{webUIName}} Backend Much Required",
"A selected model does not support image input": "",
"A selected model does not support image input": "",
"a user": "such user",
"About": "Much About",
"Account": "Account",
"Accurate information": "",
"Add": "",
"Add a model": "Add a model",
"Add a model tag name": "Add a model tag name",
"Add a short description about what this modelfile does": "Add short description about what this modelfile does",
......@@ -19,6 +20,7 @@
"Add custom prompt": "",
"Add Docs": "Add Docs",
"Add Files": "Add Files",
"Add Memory": "",
"Add message": "Add Prompt",
"Add Model": "",
"Add Tags": "",
......@@ -49,6 +51,7 @@
"Archived Chats": "",
"are allowed - Activate this command by typing": "are allowed. Activate typing",
"Are you sure?": "Such certainty?",
"As you chat with LLMs, the details and preferences it remembers will be shown here.": "",
"Attach file": "",
"Attention to detail": "",
"Audio": "Audio",
......@@ -62,7 +65,6 @@
"Bad Response": "",
"before": "",
"Being lazy": "",
"Beta": "",
"Builder Mode": "Builder Mode",
"Bypass SSL verification for Websites": "",
"Cancel": "Cancel",
......@@ -173,6 +175,7 @@
"Enabled": "So Activated",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Enter {{role}} bork here",
"Enter a detail about yourself for your LLMs to recall": "",
"Enter Chunk Overlap": "Enter Overlap of Chunks",
"Enter Chunk Size": "Enter Size of Chunk",
"Enter Image Size (e.g. 512x512)": "Enter Size of Wow (e.g. 512x512)",
......@@ -488,6 +491,7 @@
"variable": "variable very variable",
"variable to have them replaced with clipboard content.": "variable to have them replaced with clipboard content. Very replace.",
"Version": "Version much version",
"View": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "Web very web",
"Web Loader Settings": "",
......
......@@ -6,11 +6,12 @@
"{{modelName}} is thinking...": "",
"{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "",
"A selected model does not support image input": "",
"A selected model does not support image input": "",
"a user": "",
"About": "",
"Account": "",
"Accurate information": "",
"Add": "",
"Add a model": "",
"Add a model tag name": "",
"Add a short description about what this modelfile does": "",
......@@ -19,6 +20,7 @@
"Add custom prompt": "",
"Add Docs": "",
"Add Files": "",
"Add Memory": "",
"Add message": "",
"Add Model": "",
"Add Tags": "",
......@@ -49,6 +51,7 @@
"Archived Chats": "",
"are allowed - Activate this command by typing": "",
"Are you sure?": "",
"As you chat with LLMs, the details and preferences it remembers will be shown here.": "",
"Attach file": "",
"Attention to detail": "",
"Audio": "",
......@@ -62,7 +65,6 @@
"Bad Response": "",
"before": "",
"Being lazy": "",
"Beta": "",
"Builder Mode": "",
"Bypass SSL verification for Websites": "",
"Cancel": "",
......@@ -173,6 +175,7 @@
"Enabled": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "",
"Enter a detail about yourself for your LLMs to recall": "",
"Enter Chunk Overlap": "",
"Enter Chunk Size": "",
"Enter Image Size (e.g. 512x512)": "",
......@@ -488,6 +491,7 @@
"variable": "",
"variable to have them replaced with clipboard content.": "",
"Version": "",
"View": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "",
"Web Loader Settings": "",
......
......@@ -6,11 +6,12 @@
"{{modelName}} is thinking...": "",
"{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "",
"A selected model does not support image input": "",
"A selected model does not support image input": "",
"a user": "",
"About": "",
"Account": "",
"Accurate information": "",
"Add": "",
"Add a model": "",
"Add a model tag name": "",
"Add a short description about what this modelfile does": "",
......@@ -19,6 +20,7 @@
"Add custom prompt": "",
"Add Docs": "",
"Add Files": "",
"Add Memory": "",
"Add message": "",
"Add Model": "",
"Add Tags": "",
......@@ -49,6 +51,7 @@
"Archived Chats": "",
"are allowed - Activate this command by typing": "",
"Are you sure?": "",
"As you chat with LLMs, the details and preferences it remembers will be shown here.": "",
"Attach file": "",
"Attention to detail": "",
"Audio": "",
......@@ -62,7 +65,6 @@
"Bad Response": "",
"before": "",
"Being lazy": "",
"Beta": "",
"Builder Mode": "",
"Bypass SSL verification for Websites": "",
"Cancel": "",
......@@ -173,6 +175,7 @@
"Enabled": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "",
"Enter a detail about yourself for your LLMs to recall": "",
"Enter Chunk Overlap": "",
"Enter Chunk Size": "",
"Enter Image Size (e.g. 512x512)": "",
......@@ -488,6 +491,7 @@
"variable": "",
"variable to have them replaced with clipboard content.": "",
"Version": "",
"View": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "",
"Web Loader Settings": "",
......
......@@ -6,11 +6,12 @@
"{{modelName}} is thinking...": "{{modelName}} está pensando...",
"{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "{{webUIName}} Servidor Requerido",
"A selected model does not support image input": "",
"A selected model does not support image input": "",
"a user": "un usuario",
"About": "Sobre nosotros",
"Account": "Cuenta",
"Accurate information": "",
"Add": "",
"Add a model": "Agregar un modelo",
"Add a model tag name": "Agregar un nombre de etiqueta de modelo",
"Add a short description about what this modelfile does": "Agregue una descripción corta de lo que este modelfile hace",
......@@ -19,6 +20,7 @@
"Add custom prompt": "",
"Add Docs": "Agregar Documentos",
"Add Files": "Agregar Archivos",
"Add Memory": "",
"Add message": "Agregar Prompt",
"Add Model": "",
"Add Tags": "agregar etiquetas",
......@@ -49,6 +51,7 @@
"Archived Chats": "Chats archivados",
"are allowed - Activate this command by typing": "están permitidos - Active este comando escribiendo",
"Are you sure?": "¿Está seguro?",
"As you chat with LLMs, the details and preferences it remembers will be shown here.": "",
"Attach file": "",
"Attention to detail": "",
"Audio": "Audio",
......@@ -62,7 +65,6 @@
"Bad Response": "",
"before": "",
"Being lazy": "",
"Beta": "",
"Builder Mode": "Modo de Constructor",
"Bypass SSL verification for Websites": "",
"Cancel": "Cancelar",
......@@ -173,6 +175,7 @@
"Enabled": "Activado",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Ingrese el mensaje {{role}} aquí",
"Enter a detail about yourself for your LLMs to recall": "",
"Enter Chunk Overlap": "Ingresar superposición de fragmentos",
"Enter Chunk Size": "Ingrese el tamaño del fragmento",
"Enter Image Size (e.g. 512x512)": "Ingrese el tamaño de la imagen (p.ej. 512x512)",
......@@ -488,6 +491,7 @@
"variable": "variable",
"variable to have them replaced with clipboard content.": "variable para reemplazarlos con el contenido del portapapeles.",
"Version": "Versión",
"View": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "Web",
"Web Loader Settings": "",
......
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