Skip to content

Commit 8749982

Browse files
committed
wip
1 parent c42d5f7 commit 8749982

File tree

7 files changed

+285
-46
lines changed

7 files changed

+285
-46
lines changed

src/lib/components/chat/AssistantIntroduction.svelte

+5-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,10 @@
124124
</div>
125125
</div>
126126

127-
<div class="absolute right-3 top-3 md:right-4 md:top-4">
127+
<div
128+
class="absolute right-3 top-3 md:right-4 md:top-4"
129+
class:hidden={$page.data.embeddedAssistantId}
130+
>
128131
<div class="flex flex-row items-center gap-1">
129132
<button
130133
class="flex h-7 items-center gap-1.5 rounded-full border bg-white px-2.5 py-1 text-gray-800 shadow-sm hover:shadow-inner dark:border-gray-700 dark:bg-gray-700 dark:text-gray-300/90 dark:hover:bg-gray-800 max-sm:px-1.5 md:text-sm"
@@ -161,6 +164,7 @@
161164
goto(`${base}/`);
162165
}}
163166
class="absolute -bottom-6 right-2 inline-flex items-center justify-center text-xs text-gray-600 underline hover:brightness-50 dark:text-gray-400 dark:hover:brightness-110"
167+
class:hidden={$page.data.embeddedAssistantId}
164168
>
165169
<CarbonRenew class="mr-1.5 text-xxs" /> Reset to default model
166170
</button>

src/lib/components/chat/ChatWindow.svelte

+5-3
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@
225225
on:drop|preventDefault={() => (onDrag = false)}
226226
/>
227227

228-
<div class="relative min-h-0 min-w-0">
228+
<div class="relative min-w-0" class:min-h-[400px]={$page.data.embeddedAssistantId}>
229229
{#if loginModalOpen}
230230
<LoginModal
231231
on:close={() => {
@@ -237,11 +237,12 @@
237237
class="scrollbar-custom mr-1 h-full overflow-y-auto"
238238
use:snapScrollToBottom={messages.length ? [...messages] : false}
239239
bind:this={chatContainer}
240+
id="chat-container"
240241
>
241242
<div
242243
class="mx-auto flex h-full max-w-3xl flex-col gap-6 px-5 pt-6 sm:gap-8 xl:max-w-4xl xl:pt-10"
243244
>
244-
{#if $page.data?.assistant && !!messages.length}
245+
{#if $page.data?.assistant && !!messages.length && !$page.data.embeddedAssistantId}
245246
<a
246247
class="mx-auto flex items-center gap-1.5 rounded-full border border-gray-100 bg-gray-50 py-1 pl-1 pr-3 text-sm text-gray-800 hover:bg-gray-100 dark:border-gray-800 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700"
247248
href="{base}/settings/assistants/{$page.data.assistant._id}"
@@ -263,7 +264,7 @@
263264

264265
{$page.data.assistant.name}
265266
</a>
266-
{:else if preprompt && preprompt != currentModel.preprompt}
267+
{:else if preprompt && preprompt != currentModel.preprompt && !$page.data.embeddedAssistantId}
267268
<SystemPromptModal preprompt={preprompt ?? ""} />
268269
{/if}
269270

@@ -448,6 +449,7 @@
448449
</form>
449450
<div
450451
class="mt-2 flex justify-between self-stretch px-1 text-xs text-gray-400/90 max-md:mb-2 max-sm:gap-2"
452+
class:hidden={$page.data.embeddedAssistantId}
451453
>
452454
<p>
453455
Model:

src/routes/+layout.server.ts

+15-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import type { ConvSidebar } from "$lib/types/ConvSidebar";
1111
import { toolFromConfigs } from "$lib/server/tools";
1212
import { MetricsServer } from "$lib/server/metrics";
1313
import type { ToolFront, ToolInputFile } from "$lib/types/Tool";
14+
import { error } from "@sveltejs/kit";
1415

15-
export const load: LayoutServerLoad = async ({ locals, depends, request }) => {
16+
export const load: LayoutServerLoad = async ({ locals, depends, request, url }) => {
1617
depends(UrlDependency.ConversationList);
1718

1819
const settings = await collections.settings.findOne(authCondition(locals));
@@ -44,7 +45,7 @@ export const load: LayoutServerLoad = async ({ locals, depends, request }) => {
4445

4546
const assistantActive = !models.map(({ id }) => id).includes(settings?.activeModel ?? "");
4647

47-
const assistant = assistantActive
48+
let assistant = assistantActive
4849
? JSON.parse(
4950
JSON.stringify(
5051
await collections.assistants.findOne({
@@ -54,6 +55,17 @@ export const load: LayoutServerLoad = async ({ locals, depends, request }) => {
5455
)
5556
: null;
5657

58+
const embeddedAssistantId = url.searchParams.get("embeddedAssistantId");
59+
if (embeddedAssistantId) {
60+
const embeddedAssistant = await collections.assistants.findOne({
61+
_id: new ObjectId(embeddedAssistantId),
62+
});
63+
if (!embeddedAssistant) {
64+
error(404, "Embedded Assistant not found.");
65+
}
66+
assistant = JSON.parse(JSON.stringify(embeddedAssistant));
67+
}
68+
5769
const conversations = await collections.conversations
5870
.find(authCondition(locals))
5971
.sort({ updatedAt: -1 })
@@ -244,5 +256,6 @@ export const load: LayoutServerLoad = async ({ locals, depends, request }) => {
244256
loginRequired,
245257
loginEnabled: requiresUser,
246258
guestMode: requiresUser && messagesBeforeLogin > 0,
259+
embeddedAssistantId: url.searchParams.get("embeddedAssistantId"),
247260
};
248261
};

src/routes/+layout.svelte

+59-39
Original file line numberDiff line numberDiff line change
@@ -203,49 +203,69 @@
203203
{#if envPublic.PUBLIC_APPLE_APP_ID}
204204
<meta name="apple-itunes-app" content={`app-id=${envPublic.PUBLIC_APPLE_APP_ID}`} />
205205
{/if}
206+
<!-- TODO: remove -->
207+
{#if !$page.data.embeddedAssistantId}
208+
<script
209+
src="http://localhost:5173/chat/api/assistant/{$page.data.assistants.at(-1)
210+
._id}/embed-snippet"
211+
defer
212+
></script>
213+
{/if}
206214
</svelte:head>
207215

208216
{#if !$settings.ethicsModalAccepted && $page.url.pathname !== `${base}/privacy` && PUBLIC_APP_DISCLAIMER === "1"}
209217
<DisclaimerModal />
210218
{/if}
211219

212-
<ExpandNavigation
213-
isCollapsed={isNavCollapsed}
214-
on:click={() => (isNavCollapsed = !isNavCollapsed)}
215-
classNames="absolute inset-y-0 z-10 my-auto {!isNavCollapsed
216-
? 'left-[280px]'
217-
: 'left-0'} *:transition-transform"
218-
/>
219-
220-
<div
221-
class="grid h-full w-screen grid-cols-1 grid-rows-[auto,1fr] overflow-hidden text-smd {!isNavCollapsed
222-
? 'md:grid-cols-[280px,1fr]'
223-
: 'md:grid-cols-[0px,1fr]'} transition-[300ms] [transition-property:grid-template-columns] dark:text-gray-300 md:grid-rows-[1fr]"
224-
>
225-
<MobileNav isOpen={isNavOpen} on:toggle={(ev) => (isNavOpen = ev.detail)} title={mobileNavTitle}>
226-
<NavMenu
227-
conversations={data.conversations}
228-
user={data.user}
229-
canLogin={data.user === undefined && data.loginEnabled}
230-
on:shareConversation={(ev) => shareConversation(ev.detail.id, ev.detail.title)}
231-
on:deleteConversation={(ev) => deleteConversation(ev.detail)}
232-
on:editConversationTitle={(ev) => editConversationTitle(ev.detail.id, ev.detail.title)}
233-
/>
234-
</MobileNav>
235-
<nav
236-
class=" grid max-h-screen grid-cols-1 grid-rows-[auto,1fr,auto] overflow-hidden *:w-[280px] max-md:hidden"
220+
{#if !$page.data.embeddedAssistantId}
221+
<ExpandNavigation
222+
isCollapsed={isNavCollapsed}
223+
on:click={() => (isNavCollapsed = !isNavCollapsed)}
224+
classNames="absolute inset-y-0 z-10 my-auto {!isNavCollapsed
225+
? 'left-[280px]'
226+
: 'left-0'} *:transition-transform"
227+
/>
228+
229+
<div
230+
class="grid h-full w-screen grid-cols-1 grid-rows-[auto,1fr] overflow-hidden text-smd {!isNavCollapsed
231+
? 'md:grid-cols-[280px,1fr]'
232+
: 'md:grid-cols-[0px,1fr]'} transition-[300ms] [transition-property:grid-template-columns] dark:text-gray-300 md:grid-rows-[1fr]"
237233
>
238-
<NavMenu
239-
conversations={data.conversations}
240-
user={data.user}
241-
canLogin={data.user === undefined && data.loginEnabled}
242-
on:shareConversation={(ev) => shareConversation(ev.detail.id, ev.detail.title)}
243-
on:deleteConversation={(ev) => deleteConversation(ev.detail)}
244-
on:editConversationTitle={(ev) => editConversationTitle(ev.detail.id, ev.detail.title)}
245-
/>
246-
</nav>
247-
{#if currentError}
248-
<Toast message={currentError} />
249-
{/if}
250-
<slot />
251-
</div>
234+
<MobileNav
235+
isOpen={isNavOpen}
236+
on:toggle={(ev) => (isNavOpen = ev.detail)}
237+
title={mobileNavTitle}
238+
>
239+
<NavMenu
240+
conversations={data.conversations}
241+
user={data.user}
242+
canLogin={data.user === undefined && data.loginEnabled}
243+
on:shareConversation={(ev) => shareConversation(ev.detail.id, ev.detail.title)}
244+
on:deleteConversation={(ev) => deleteConversation(ev.detail)}
245+
on:editConversationTitle={(ev) => editConversationTitle(ev.detail.id, ev.detail.title)}
246+
/>
247+
</MobileNav>
248+
<nav
249+
class=" grid max-h-screen grid-cols-1 grid-rows-[auto,1fr,auto] overflow-hidden *:w-[280px] max-md:hidden"
250+
>
251+
<NavMenu
252+
conversations={data.conversations}
253+
user={data.user}
254+
canLogin={data.user === undefined && data.loginEnabled}
255+
on:shareConversation={(ev) => shareConversation(ev.detail.id, ev.detail.title)}
256+
on:deleteConversation={(ev) => deleteConversation(ev.detail)}
257+
on:editConversationTitle={(ev) => editConversationTitle(ev.detail.id, ev.detail.title)}
258+
/>
259+
</nav>
260+
{#if currentError}
261+
<Toast message={currentError} />
262+
{/if}
263+
<slot />
264+
</div>
265+
{:else}
266+
<div
267+
class="grid h-full w-screen grid-cols-1 grid-rows-[auto,1fr] overflow-hidden text-smd dark:text-gray-300"
268+
>
269+
<slot />
270+
</div>
271+
{/if}

src/routes/+page.svelte

+12-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@
4444
body: JSON.stringify({
4545
model,
4646
preprompt: $settings.customPrompts[$settings.activeModel],
47-
assistantId: data.assistant?._id,
47+
assistantId: data.embeddedAssistantId ?? data.assistant?._id,
48+
// todo: embeddedAssistantId should be an actual field so that it can check
4849
}),
4950
});
5051
@@ -63,6 +64,16 @@
6364
files,
6465
});
6566
67+
// embedded assistant
68+
if (data.embeddedAssistantId) {
69+
await goto(
70+
`${base}/conversation/${conversationId}/?embeddedAssistantId=${encodeURIComponent(
71+
data.embeddedAssistantId
72+
)}`
73+
);
74+
return;
75+
}
76+
6677
// invalidateAll to update list of conversations
6778
await goto(`${base}/conversation/${conversationId}`, { invalidateAll: true });
6879
} catch (err) {

0 commit comments

Comments
 (0)