Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
chenpangpang
open-webui
Commits
7031aa14
"...git@developer.sourcefind.cn:chenpangpang/open-webui.git" did not exist on "22c50f62cbbe9445bc8ea00695310ed740ad3789"
Unverified
Commit
7031aa14
authored
Mar 07, 2024
by
Ased Mammad
Committed by
GitHub
Mar 07, 2024
Browse files
Merge branch 'dev' into feat/add-i18n
parents
08aa60b3
a9010318
Changes
30
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
506 additions
and
389 deletions
+506
-389
src/lib/components/chat/Messages.svelte
src/lib/components/chat/Messages.svelte
+117
-72
src/lib/components/chat/Messages/ResponseMessage.svelte
src/lib/components/chat/Messages/ResponseMessage.svelte
+246
-220
src/lib/components/chat/Messages/UserMessage.svelte
src/lib/components/chat/Messages/UserMessage.svelte
+54
-46
src/lib/components/chat/Settings/Connections.svelte
src/lib/components/chat/Settings/Connections.svelte
+79
-35
src/lib/components/chat/Settings/Models.svelte
src/lib/components/chat/Settings/Models.svelte
+3
-3
src/lib/components/documents/AddDocModal.svelte
src/lib/components/documents/AddDocModal.svelte
+3
-1
src/lib/constants.ts
src/lib/constants.ts
+0
-5
src/routes/(app)/+layout.svelte
src/routes/(app)/+layout.svelte
+0
-3
src/routes/(app)/+page.svelte
src/routes/(app)/+page.svelte
+2
-2
src/routes/(app)/c/[id]/+page.svelte
src/routes/(app)/c/[id]/+page.svelte
+2
-2
No files found.
src/lib/components/chat/Messages.svelte
View file @
7031aa14
...
@@ -225,33 +225,80 @@
...
@@ -225,33 +225,80 @@
}, 100);
}, 100);
};
};
// TODO: change delete behaviour
const messageDeleteHandler = async (messageId) => {
// const deleteMessageAndDescendants = async (messageId: string) => {
const messageToDelete = history.messages[messageId];
// if (history.messages[messageId]) {
const messageParentId = messageToDelete.parentId;
// history.messages[messageId].deleted = true;
const messageChildrenIds = messageToDelete.childrenIds ?? [];
const hasSibling = messageChildrenIds.some(
(childId) => history.messages[childId]?.childrenIds?.length > 0
);
messageChildrenIds.forEach((childId) => {
const child = history.messages[childId];
if (child && child.childrenIds) {
if (child.childrenIds.length === 0 && !hasSibling) {
// if last prompt/response pair
history.messages[messageParentId].childrenIds = [];
history.currentId = messageParentId;
} else {
child.childrenIds.forEach((grandChildId) => {
if (history.messages[grandChildId]) {
history.messages[grandChildId].parentId = messageParentId;
history.messages[messageParentId].childrenIds.push(grandChildId);
}
});
}
}
// remove response
history.messages[messageParentId].childrenIds = history.messages[
messageParentId
].childrenIds.filter((id) => id !== childId);
});
// remove prompt
history.messages[messageParentId].childrenIds = history.messages[
messageParentId
].childrenIds.filter((id) => id !== messageId);
await updateChatById(localStorage.token, chatId, {
messages: messages,
history: history
});
};
// const messageDeleteHandler = async (messageId) => {
// const message = history.messages[messageId];
// const parentId = message.parentId;
// const childrenIds = message.childrenIds ?? [];
// const grandchildrenIds = [];
// for (const childId of history.messages[messageId].childrenIds) {
// // Iterate through childrenIds to find grandchildrenIds
// await deleteMessageAndDescendants(childId);
// for (const childId of childrenIds) {
// const childMessage = history.messages[childId];
// const grandChildrenIds = childMessage.childrenIds ?? [];
// for (const grandchildId of grandchildrenIds) {
// const childMessage = history.messages[grandchildId];
// childMessage.parentId = parentId;
// }
// }
// grandchildrenIds.push(...grandChildrenIds);
// }
// }
// };
// const triggerDeleteMessageRecursive = async (messageId: string) => {
// await deleteMessageAndDescendants(messageId);
// await updateChatById(localStorage.token, chatId, { history });
// await chats.set(await getChatList(localStorage.token));
// };
const messageDeleteHandler = async (messageId) => {
// history.messages[parentId].childrenIds.push(...grandchildrenIds);
if (history.messages[messageId]) {
// history.messages[parentId].childrenIds = history.messages[parentId].childrenIds.filter(
history.messages[messageId].deleted = true;
// (id) => id !== messageId
// );
// // Select latest message
// let currentMessageId = grandchildrenIds.at(-1);
// if (currentMessageId) {
// let messageChildrenIds = history.messages[currentMessageId].childrenIds;
// while (messageChildrenIds.length !== 0) {
// currentMessageId = messageChildrenIds.at(-1);
// messageChildrenIds = history.messages[currentMessageId].childrenIds;
// }
// history.currentId = currentMessageId;
// }
for (const childId of history.messages[messageId].childrenIds) {
// await updateChatById(localStorage.token, chatId, { messages, history });
history.messages[childId].deleted = true;
// };
}
}
await updateChatById(localStorage.token, chatId, { history });
};
</script>
</script>
{#if messages.length == 0}
{#if messages.length == 0}
...
@@ -260,57 +307,55 @@
...
@@ -260,57 +307,55 @@
<div class=" pb-10">
<div class=" pb-10">
{#key chatId}
{#key chatId}
{#each messages as message, messageIdx}
{#each messages as message, messageIdx}
{#if !message.deleted}
<div class=" w-full">
<div class=" w-full">
<div
<div
class="flex flex-col justify-between px-5 mb-3 {$settings?.fullScreenMode ?? null
class="flex flex-col justify-between px-5 mb-3 {$settings?.fullScreenMode ?? null
? 'max-w-full'
? 'max-w-full'
: 'max-w-3xl'} mx-auto rounded-lg group"
: 'max-w-3xl'} mx-auto rounded-lg group"
>
>
{#if message.role === 'user'}
{#if message.role === 'user'}
<UserMessage
<UserMessage
on:delete={() => messageDeleteHandler(message.id)}
on:delete={() => messageDeleteHandler(message.id)}
user={$user}
user={$user}
{message}
{message}
isFirstMessage={messageIdx === 0}
isFirstMessage={messageIdx === 0}
siblings={message.parentId !== null
siblings={message.parentId !== null
? history.messages[message.parentId]?.childrenIds ?? []
? history.messages[message.parentId]?.childrenIds ?? []
: Object.values(history.messages)
: Object.values(history.messages)
.filter((message) => message.parentId === null)
.filter((message) => message.parentId === null)
.map((message) => message.id) ?? []}
.map((message) => message.id) ?? []}
{confirmEditMessage}
{confirmEditMessage}
{showPreviousMessage}
{showPreviousMessage}
{showNextMessage}
{showNextMessage}
{copyToClipboard}
{copyToClipboard}
/>
/>
{:else}
{:else}
<ResponseMessage
<ResponseMessage
{message}
{message}
modelfiles={selectedModelfiles}
modelfiles={selectedModelfiles}
siblings={history.messages[message.parentId]?.childrenIds ?? []}
siblings={history.messages[message.parentId]?.childrenIds ?? []}
isLastMessage={messageIdx + 1 === messages.length}
isLastMessage={messageIdx + 1 === messages.length}
{confirmEditResponseMessage}
{confirmEditResponseMessage}
{showPreviousMessage}
{showPreviousMessage}
{showNextMessage}
{showNextMessage}
{rateMessage}
{rateMessage}
{copyToClipboard}
{copyToClipboard}
{continueGeneration}
{continueGeneration}
{regenerateResponse}
{regenerateResponse}
on:save={async (e) => {
on:save={async (e) => {
console.log('save', e);
console.log('save', e);
const message = e.detail;
const message = e.detail;
history.messages[message.id] = message;
history.messages[message.id] = message;
await updateChatById(localStorage.token, chatId, {
await updateChatById(localStorage.token, chatId, {
messages: messages,
messages: messages,
history: history
history: history
});
});
}}
}}
/>
/>
{/if}
{/if}
</div>
</div>
</div>
{/if}
</div>
{/each}
{/each}
{#if bottomPadding}
{#if bottomPadding}
...
...
src/lib/components/chat/Messages/ResponseMessage.svelte
View file @
7031aa14
This diff is collapsed.
Click to expand it.
src/lib/components/chat/Messages/UserMessage.svelte
View file @
7031aa14
...
@@ -5,6 +5,7 @@
...
@@ -5,6 +5,7 @@
import Name from './Name.svelte';
import Name from './Name.svelte';
import ProfileImage from './ProfileImage.svelte';
import ProfileImage from './ProfileImage.svelte';
import { modelfiles, settings } from '$lib/stores';
import { modelfiles, settings } from '$lib/stores';
import Tooltip from '$lib/components/common/Tooltip.svelte';
const i18n = getContext('i18n');
const i18n = getContext('i18n');
...
@@ -171,7 +172,8 @@
...
@@ -171,7 +172,8 @@
class=" bg-transparent outline-none w-full resize-none"
class=" bg-transparent outline-none w-full resize-none"
bind:value={editedContent}
bind:value={editedContent}
on:input={(e) => {
on:input={(e) => {
messageEditTextAreaElement.style.height = `${messageEditTextAreaElement.scrollHeight}px`;
e.target.style.height = '';
e.target.style.height = `${e.target.scrollHeight}px`;
}}
}}
/>
/>
...
@@ -248,55 +250,35 @@
...
@@ -248,55 +250,35 @@
</div>
</div>
{/if}
{/if}
<button
<Tooltip content="Edit" placement="bottom">
class="invisible group-hover:visible p-1 rounded dark:hover:text-white hover:text-black transition edit-user-message-button"
<button
on:click={() => {
class="invisible group-hover:visible p-1 rounded dark:hover:text-white hover:text-black transition edit-user-message-button"
editMessageHandler();
on:click={() => {
}}
editMessageHandler();
>
}}
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="w-4 h-4"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"
/>
</svg>
</button>
<button
class="invisible group-hover:visible p-1 rounded dark:hover:text-white hover:text-black transition"
on:click={() => {
copyToClipboard(message.content);
}}
>
<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
<svg
stroke-linecap="round"
xmlns="http://www.w3.org/2000/svg"
stroke-linejoin="round"
fill="none"
d="M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184"
viewBox="0 0 24 24"
/>
stroke-width="1.5"
</svg>
stroke="currentColor"
</button>
class="w-4 h-4"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"
/>
</svg>
</button>
</Tooltip>
{#if !isFirstMessage}
<Tooltip content="Copy" placement="bottom">
<button
<button
class="invisible group-hover:visible p-1 rounded dark:hover:text-white hover:text-black transition"
class="invisible group-hover:visible p-1 rounded dark:hover:text-white hover:text-black transition"
on:click={() => {
on:click={() => {
deleteMessageHandler(
);
copyToClipboard(message.content
);
}}
}}
>
>
<svg
<svg
...
@@ -310,10 +292,36 @@
...
@@ -310,10 +292,36 @@
<path
<path
stroke-linecap="round"
stroke-linecap="round"
stroke-linejoin="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.1
6 1
9
.6
73a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.2
5 0 0
1-
2.244-2.077L4.772 5.79m14.456 0a48.108 4
8.
1
08
0 0 0-3.478-.397m-12 .562c.34-.059.68-
.11
4
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.0
9
1.
022-2.09 2.201v.916m7.5 0
a48.
667
48.
667
0 0
0-7.5 0
"
d="
M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.16
6 1.6
38m7.332 0c.055.194.084.4.084.612v0a.75.7
5 0 01-
.75.75H9a.75.75 0 01-.75-.75v0c0-.212.03-.41
8.08
4-.612m7.332 0c.646.049 1.288
.11 1.
927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0
-1.1
0
8.
806
-2.0
57
1.
907-2.185
a48.
208
48.
208
0 0
11.927-.184
"
/>
/>
</svg>
</svg>
</button>
</button>
</Tooltip>
{#if !isFirstMessage}
<Tooltip content="Delete" placement="bottom">
<button
class="invisible group-hover:visible p-1 rounded dark:hover:text-white hover:text-black transition"
on:click={() => {
deleteMessageHandler();
}}
>
<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>
{/if}
{/if}
</div>
</div>
</div>
</div>
...
...
src/lib/components/chat/Settings/Connections.svelte
View file @
7031aa14
...
@@ -4,7 +4,12 @@
...
@@ -4,7 +4,12 @@
const dispatch = createEventDispatcher();
const dispatch = createEventDispatcher();
import { getOllamaUrls, getOllamaVersion, updateOllamaUrls } from '$lib/apis/ollama';
import { getOllamaUrls, getOllamaVersion, updateOllamaUrls } from '$lib/apis/ollama';
import { getOpenAIKey, getOpenAIUrl, updateOpenAIKey, updateOpenAIUrl } from '$lib/apis/openai';
import {
getOpenAIKeys,
getOpenAIUrls,
updateOpenAIKeys,
updateOpenAIUrls
} from '$lib/apis/openai';
import { toast } from 'svelte-sonner';
import { toast } from 'svelte-sonner';
const i18n = getContext('i18n');
const i18n = getContext('i18n');
...
@@ -18,12 +23,14 @@
...
@@ -18,12 +23,14 @@
let OPENAI_API_KEY = '';
let OPENAI_API_KEY = '';
let OPENAI_API_BASE_URL = '';
let OPENAI_API_BASE_URL = '';
let OPENAI_API_KEYS = [''];
let OPENAI_API_BASE_URLS = [''];
let showOpenAI = false;
let showOpenAI = false;
let showLiteLLM = false;
const updateOpenAIHandler = async () => {
const updateOpenAIHandler = async () => {
OPENAI_API_BASE_URL = await updateOpenAIUrl(localStorage.token, OPENAI_API_BASE_URL);
OPENAI_API_BASE_URL
S
= await updateOpenAIUrl
s
(localStorage.token, OPENAI_API_BASE_URL
S
);
OPENAI_API_KEY = await updateOpenAIKey(localStorage.token, OPENAI_API_KEY);
OPENAI_API_KEY
S
= await updateOpenAIKey
s
(localStorage.token, OPENAI_API_KEY
S
);
await models.set(await getModels());
await models.set(await getModels());
};
};
...
@@ -45,8 +52,8 @@
...
@@ -45,8 +52,8 @@
onMount(async () => {
onMount(async () => {
if ($user.role === 'admin') {
if ($user.role === 'admin') {
OLLAMA_BASE_URLS = await getOllamaUrls(localStorage.token);
OLLAMA_BASE_URLS = await getOllamaUrls(localStorage.token);
OPENAI_API_BASE_URL = await getOpenAIUrl(localStorage.token);
OPENAI_API_BASE_URL
S
= await getOpenAIUrl
s
(localStorage.token);
OPENAI_API_KEY = await getOpenAIKey(localStorage.token);
OPENAI_API_KEY
S
= await getOpenAIKey
s
(localStorage.token);
}
}
});
});
</script>
</script>
...
@@ -73,37 +80,74 @@
...
@@ -73,37 +80,74 @@
</div>
</div>
{#if showOpenAI}
{#if showOpenAI}
<div>
<div class="flex flex-col gap-1">
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('API Key')}</div>
{#each OPENAI_API_BASE_URLS as url, idx}
<div class="flex w-full">
<div class="flex w-full gap-2">
<div class="flex-1">
<div class="flex-1">
<input
<input
class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none"
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
placeholder={$i18n.t('Enter OpenAI API Key')}
placeholder={$i18n.t('API Base URL')}
bind:value={OPENAI_API_KEY}
bind:value={url}
autocomplete="off"
autocomplete="off"
/>
/>
</div>
</div>
</div>
</div>
<div>
<div class="flex-1">
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('API Base URL')}</div>
<input
<div class="flex w-full">
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
<div class="flex-1">
placeholder={$i18n.t('API Key')}
<input
bind:value={OPENAI_API_KEYS[idx]}
class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none"
autocomplete="off"
placeholder="Enter OpenAI API Base URL"
/>
bind:value={OPENAI_API_BASE_URL}
</div>
autocomplete="off"
<div class="self-center flex items-center">
/>
{#if idx === 0}
<button
class="px-1"
on:click={() => {
OPENAI_API_BASE_URLS = [...OPENAI_API_BASE_URLS, ''];
OPENAI_API_KEYS = [...OPENAI_API_KEYS, ''];
}}
type="button"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
/>
</svg>
</button>
{:else}
<button
class="px-1"
on:click={() => {
OPENAI_API_BASE_URLS = OPENAI_API_BASE_URLS.filter(
(url, urlIdx) => idx !== urlIdx
);
OPENAI_API_KEYS = OPENAI_API_KEYS.filter((key, keyIdx) => idx !== keyIdx);
}}
type="button"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path d="M3.75 7.25a.75.75 0 0 0 0 1.5h8.5a.75.75 0 0 0 0-1.5h-8.5Z" />
</svg>
</button>
{/if}
</div>
</div>
</div>
</div>
<div class=" mb-1 text-xs text-gray-400 dark:text-gray-500">
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
WebUI will make requests to <span class=" text-gray-200">'{url}/models'</span>
WebUI will make requests to <span class=" text-gray-200"
</div>
>'{OPENAI_API_BASE_URL}/chat'</span
{/each}
>
</div>
</div>
</div>
{/if}
{/if}
</div>
</div>
...
...
src/lib/components/chat/Settings/Models.svelte
View file @
7031aa14
...
@@ -56,7 +56,7 @@
...
@@ -56,7 +56,7 @@
let modelUploadMode = 'file';
let modelUploadMode = 'file';
let modelInputFile = '';
let modelInputFile = '';
let modelFileUrl = '';
let modelFileUrl = '';
let modelFileContent = `TEMPLATE """{{ .System }}\nUSER: {{ .Prompt }}\nASS
S
ISTANT: """\nPARAMETER num_ctx 4096\nPARAMETER stop "</s>"\nPARAMETER stop "USER:"\nPARAMETER stop "ASS
S
ISTANT:"`;
let modelFileContent = `TEMPLATE """{{ .System }}\nUSER: {{ .Prompt }}\nASSISTANT: """\nPARAMETER num_ctx 4096\nPARAMETER stop "</s>"\nPARAMETER stop "USER:"\nPARAMETER stop "ASSISTANT:"`;
let modelFileDigest = '';
let modelFileDigest = '';
let uploadProgress = null;
let uploadProgress = null;
...
@@ -517,7 +517,7 @@
...
@@ -517,7 +517,7 @@
{#if !deleteModelTag}
{#if !deleteModelTag}
<option value="" disabled selected>Select a model</option>
<option value="" disabled selected>Select a model</option>
{/if}
{/if}
{#each $models.filter((m) => m.size != null) as model}
{#each $models.filter((m) => m.size != null
&& (selectedOllamaUrlIdx === null ? true : (m?.urls ?? []).includes(selectedOllamaUrlIdx))
) as model}
<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
>{model.name + ' (' + (model.size / 1024 ** 3).toFixed(1) + ' GB)'}</option
>{model.name + ' (' + (model.size / 1024 ** 3).toFixed(1) + ' GB)'}</option
>
>
...
@@ -599,7 +599,7 @@
...
@@ -599,7 +599,7 @@
on:change={() => {
on:change={() => {
console.log(modelInputFile);
console.log(modelInputFile);
}}
}}
accept=".gguf"
accept=".gguf
,.safetensors
"
required
required
hidden
hidden
/>
/>
...
...
src/lib/components/documents/AddDocModal.svelte
View file @
7031aa14
...
@@ -140,7 +140,9 @@
...
@@ -140,7 +140,9 @@
<button
<button
class="w-full text-sm font-medium py-3 bg-gray-850 hover:bg-gray-800 text-center rounded-xl"
class="w-full text-sm font-medium py-3 bg-gray-850 hover:bg-gray-800 text-center rounded-xl"
type="button"
type="button"
on:click={uploadDocInputElement.click}
on:click={() => {
uploadDocInputElement.click();
}}
>
>
{#if inputFiles}
{#if inputFiles}
{inputFiles.length > 0 ? `${inputFiles.length}` : ''} document(s) selected.
{inputFiles.length > 0 ? `${inputFiles.length}` : ''} document(s) selected.
...
...
src/lib/constants.ts
View file @
7031aa14
...
@@ -90,8 +90,3 @@ export const SUPPORTED_FILE_EXTENSIONS = [
...
@@ -90,8 +90,3 @@ export const SUPPORTED_FILE_EXTENSIONS = [
// This feature, akin to $env/static/private, exclusively incorporates environment variables
// This feature, akin to $env/static/private, exclusively incorporates environment variables
// that are prefixed with config.kit.env.publicPrefix (usually set to PUBLIC_).
// that are prefixed with config.kit.env.publicPrefix (usually set to PUBLIC_).
// Consequently, these variables can be securely exposed to client-side code.
// Consequently, these variables can be securely exposed to client-side code.
// Example of the .env configuration:
// OLLAMA_API_BASE_URL="http://localhost:11434/api"
// # Public
// PUBLIC_API_BASE_URL=$OLLAMA_API_BASE_URL
src/routes/(app)/+layout.svelte
View file @
7031aa14
...
@@ -99,14 +99,11 @@
...
@@ -99,14 +99,11 @@
if (localDBChats.length === 0) {
if (localDBChats.length === 0) {
await deleteDB('Chats');
await deleteDB('Chats');
}
}
console.log('localdb', localDBChats);
}
}
console.log(DB);
console.log(DB);
} catch (error) {
} catch (error) {
// IndexedDB Not Found
// IndexedDB Not Found
console.log('IDB Not Found');
}
}
console.log();
console.log();
...
...
src/routes/(app)/+page.svelte
View file @
7031aa14
...
@@ -344,7 +344,7 @@
...
@@ -344,7 +344,7 @@
content
:
$
settings
.
system
content
:
$
settings
.
system
}
}
:
undefined
,
:
undefined
,
...
messages
.
filter
((
message
)
=>
!message.deleted)
...
messages
]
]
.
filter
((
message
)
=>
message
)
.
filter
((
message
)
=>
message
)
.
map
((
message
,
idx
,
arr
)
=>
({
.
map
((
message
,
idx
,
arr
)
=>
({
...
@@ -558,7 +558,7 @@
...
@@ -558,7 +558,7 @@
content
:
$
settings
.
system
content
:
$
settings
.
system
}
}
:
undefined
,
:
undefined
,
...
messages
.
filter
((
message
)
=>
!message.deleted)
...
messages
]
]
.
filter
((
message
)
=>
message
)
.
filter
((
message
)
=>
message
)
.
map
((
message
,
idx
,
arr
)
=>
({
.
map
((
message
,
idx
,
arr
)
=>
({
...
...
src/routes/(app)/c/[id]/+page.svelte
View file @
7031aa14
...
@@ -354,7 +354,7 @@
...
@@ -354,7 +354,7 @@
content
:
$
settings
.
system
content
:
$
settings
.
system
}
}
:
undefined
,
:
undefined
,
...
messages
.
filter
((
message
)
=>
!message.deleted)
...
messages
]
]
.
filter
((
message
)
=>
message
)
.
filter
((
message
)
=>
message
)
.
map
((
message
,
idx
,
arr
)
=>
({
.
map
((
message
,
idx
,
arr
)
=>
({
...
@@ -568,7 +568,7 @@
...
@@ -568,7 +568,7 @@
content
:
$
settings
.
system
content
:
$
settings
.
system
}
}
:
undefined
,
:
undefined
,
...
messages
.
filter
((
message
)
=>
!message.deleted)
...
messages
]
]
.
filter
((
message
)
=>
message
)
.
filter
((
message
)
=>
message
)
.
map
((
message
,
idx
,
arr
)
=>
({
.
map
((
message
,
idx
,
arr
)
=>
({
...
...
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment