Spaces:
Running
Running
set provider in response
Browse files
src/lib/components/chat/Assistant.svelte
CHANGED
|
@@ -1,20 +1,9 @@
|
|
| 1 |
<script lang="ts">
|
| 2 |
-
import {
|
| 3 |
-
|
| 4 |
-
useEdges,
|
| 5 |
-
useNodes,
|
| 6 |
-
useNodesData,
|
| 7 |
-
Position,
|
| 8 |
-
type NodeProps,
|
| 9 |
-
type Edge,
|
| 10 |
-
type Node,
|
| 11 |
-
useSvelteFlow
|
| 12 |
-
} from '@xyflow/svelte';
|
| 13 |
|
| 14 |
import type { ChatModel, ChatMessage } from '$lib/helpers/types';
|
| 15 |
import { Button } from '$lib/components/ui/button';
|
| 16 |
-
import ComboBoxModels from '$lib/components/model/ComboBoxModels.svelte';
|
| 17 |
-
import { onMount } from 'svelte';
|
| 18 |
import Message from './Message.svelte';
|
| 19 |
import Spinner from '$lib/components/loading/Spinner.svelte';
|
| 20 |
|
|
@@ -23,7 +12,7 @@
|
|
| 23 |
// svelte-ignore state_referenced_locally
|
| 24 |
const nodeData = useNodesData(id);
|
| 25 |
|
| 26 |
-
let
|
| 27 |
let loading = $derived((nodeData.current?.data.loading as boolean) ?? false);
|
| 28 |
let message = $derived(
|
| 29 |
nodeData.current?.data.content
|
|
@@ -40,12 +29,14 @@
|
|
| 40 |
<div class="nodrag">
|
| 41 |
<header class="mb-3 flex items-center justify-between">
|
| 42 |
<div class="flex flex-wrap items-center gap-1">
|
| 43 |
-
|
| 44 |
-
<
|
| 45 |
-
|
| 46 |
-
{
|
| 47 |
-
|
| 48 |
-
|
|
|
|
|
|
|
| 49 |
</div>
|
| 50 |
</header>
|
| 51 |
|
|
@@ -56,7 +47,7 @@
|
|
| 56 |
</div>
|
| 57 |
{/if}
|
| 58 |
{#if message}
|
| 59 |
-
<Message {message} />
|
| 60 |
{/if}
|
| 61 |
</div>
|
| 62 |
</article>
|
|
|
|
| 1 |
<script lang="ts">
|
| 2 |
+
import { Handle, useNodesData, Position, type NodeProps } from '@xyflow/svelte';
|
| 3 |
+
import { Star } from '@lucide/svelte';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
|
| 5 |
import type { ChatModel, ChatMessage } from '$lib/helpers/types';
|
| 6 |
import { Button } from '$lib/components/ui/button';
|
|
|
|
|
|
|
| 7 |
import Message from './Message.svelte';
|
| 8 |
import Spinner from '$lib/components/loading/Spinner.svelte';
|
| 9 |
|
|
|
|
| 12 |
// svelte-ignore state_referenced_locally
|
| 13 |
const nodeData = useNodesData(id);
|
| 14 |
|
| 15 |
+
let selectedModel = $derived((nodeData.current?.data.selectedModel as ChatModel) ?? null);
|
| 16 |
let loading = $derived((nodeData.current?.data.loading as boolean) ?? false);
|
| 17 |
let message = $derived(
|
| 18 |
nodeData.current?.data.content
|
|
|
|
| 29 |
<div class="nodrag">
|
| 30 |
<header class="mb-3 flex items-center justify-between">
|
| 31 |
<div class="flex flex-wrap items-center gap-1">
|
| 32 |
+
<Button variant="outline" size="sm" class="group relative font-normal! shadow-none!">
|
| 33 |
+
<img
|
| 34 |
+
src={selectedModel.avatarUrl}
|
| 35 |
+
alt={selectedModel.modelName}
|
| 36 |
+
class="size-3.5 rounded-full"
|
| 37 |
+
/>
|
| 38 |
+
{selectedModel.modelName}
|
| 39 |
+
</Button>
|
| 40 |
</div>
|
| 41 |
</header>
|
| 42 |
|
|
|
|
| 47 |
</div>
|
| 48 |
{/if}
|
| 49 |
{#if message}
|
| 50 |
+
<Message {message} provider={selectedModel.provider} />
|
| 51 |
{/if}
|
| 52 |
</div>
|
| 53 |
</article>
|
src/lib/components/chat/Message.svelte
CHANGED
|
@@ -11,8 +11,9 @@
|
|
| 11 |
import ListItem from './markdown/ListItem.svelte';
|
| 12 |
import Link from './markdown/Link.svelte';
|
| 13 |
import Hr from './markdown/Hr.svelte';
|
|
|
|
| 14 |
|
| 15 |
-
let { message }: { message: ChatMessage } = $props();
|
| 16 |
|
| 17 |
const renderers = {
|
| 18 |
paragraph: Paragraph,
|
|
@@ -35,9 +36,22 @@
|
|
| 35 |
{:else}
|
| 36 |
<SvelteMarkdown source={message.content} renderers={renderers as any} />
|
| 37 |
{#if message.timestamp}
|
| 38 |
-
<p class="text-xs text-muted-foreground/70">
|
| 39 |
-
|
| 40 |
-
{message.timestamp / 1000}s
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
</p>
|
| 42 |
{/if}
|
| 43 |
{/if}
|
|
|
|
| 11 |
import ListItem from './markdown/ListItem.svelte';
|
| 12 |
import Link from './markdown/Link.svelte';
|
| 13 |
import Hr from './markdown/Hr.svelte';
|
| 14 |
+
import { Star } from '@lucide/svelte';
|
| 15 |
|
| 16 |
+
let { message, provider }: { message: ChatMessage; provider?: string } = $props();
|
| 17 |
|
| 18 |
const renderers = {
|
| 19 |
paragraph: Paragraph,
|
|
|
|
| 36 |
{:else}
|
| 37 |
<SvelteMarkdown source={message.content} renderers={renderers as any} />
|
| 38 |
{#if message.timestamp}
|
| 39 |
+
<p class="flex items-center gap-1 text-xs text-muted-foreground/70">
|
| 40 |
+
Generated in
|
| 41 |
+
{message.timestamp / 1000}s using
|
| 42 |
+
<span class="flex items-center gap-1 rounded bg-muted py-0.5 pr-1 pl-0.5">
|
| 43 |
+
{#if provider === 'auto'}
|
| 44 |
+
<Star class="size-4 fill-yellow-500 text-yellow-500" />
|
| 45 |
+
{:else}
|
| 46 |
+
<img
|
| 47 |
+
src={`https://huggingface.co/api/avatars/${provider}`}
|
| 48 |
+
alt={provider}
|
| 49 |
+
class="size-4"
|
| 50 |
+
/>
|
| 51 |
+
{/if}
|
| 52 |
+
{provider}
|
| 53 |
+
</span>
|
| 54 |
+
provider
|
| 55 |
</p>
|
| 56 |
{/if}
|
| 57 |
{/if}
|
src/lib/components/chat/User.svelte
CHANGED
|
@@ -80,7 +80,7 @@
|
|
| 80 |
},
|
| 81 |
data: {
|
| 82 |
role: 'assistant',
|
| 83 |
-
|
| 84 |
content: '',
|
| 85 |
loading: true
|
| 86 |
}
|
|
@@ -106,10 +106,7 @@
|
|
| 106 |
|
| 107 |
async function handleTriggerAiCall(newNodes: Node[]) {
|
| 108 |
newNodes.forEach(async (node) => {
|
| 109 |
-
const model =
|
| 110 |
-
(node?.data?.selectedModels as ChatModel[])?.length > 0
|
| 111 |
-
? (node?.data?.selectedModels as ChatModel[])[0]
|
| 112 |
-
: null;
|
| 113 |
if (!model) return;
|
| 114 |
try {
|
| 115 |
const start = Date.now();
|
|
@@ -148,7 +145,7 @@
|
|
| 148 |
data: {
|
| 149 |
role: 'user',
|
| 150 |
messages: [...messages, { role: 'assistant', content }],
|
| 151 |
-
|
| 152 |
}
|
| 153 |
};
|
| 154 |
const newEdge: Edge = {
|
|
|
|
| 80 |
},
|
| 81 |
data: {
|
| 82 |
role: 'assistant',
|
| 83 |
+
selectedModel: m,
|
| 84 |
content: '',
|
| 85 |
loading: true
|
| 86 |
}
|
|
|
|
| 106 |
|
| 107 |
async function handleTriggerAiCall(newNodes: Node[]) {
|
| 108 |
newNodes.forEach(async (node) => {
|
| 109 |
+
const model = node?.data?.selectedModel as ChatModel;
|
|
|
|
|
|
|
|
|
|
| 110 |
if (!model) return;
|
| 111 |
try {
|
| 112 |
const start = Date.now();
|
|
|
|
| 145 |
data: {
|
| 146 |
role: 'user',
|
| 147 |
messages: [...messages, { role: 'assistant', content }],
|
| 148 |
+
selectedModel: model
|
| 149 |
}
|
| 150 |
};
|
| 151 |
const newEdge: Edge = {
|
src/lib/components/model/SettingsModel.svelte
CHANGED
|
@@ -45,7 +45,10 @@
|
|
| 45 |
});
|
| 46 |
</script>
|
| 47 |
|
| 48 |
-
<Popover.Root
|
|
|
|
|
|
|
|
|
|
| 49 |
<Popover.Trigger>{@render children?.()}</Popover.Trigger>
|
| 50 |
<Popover.Content class="w-80 rounded-2xl p-0">
|
| 51 |
<div class="grid gap-4">
|
|
@@ -149,7 +152,7 @@
|
|
| 149 |
<header class="border-t border-border px-5 pt-4">
|
| 150 |
<h4 class="text-sm leading-none font-medium text-muted-foreground">Provider</h4>
|
| 151 |
</header>
|
| 152 |
-
<main class="w-full px-5">
|
| 153 |
<Select.Root type="single" bind:value={provider}>
|
| 154 |
<Select.Trigger class="flex w-full items-center justify-between gap-2 capitalize">
|
| 155 |
<div class="flex items-center gap-2">
|
|
@@ -184,16 +187,6 @@
|
|
| 184 |
</Select.Content>
|
| 185 |
</Select.Root>
|
| 186 |
</main>
|
| 187 |
-
<footer class="flex justify-end border-t border-border px-5 pt-3 pb-3">
|
| 188 |
-
<Button
|
| 189 |
-
variant="default"
|
| 190 |
-
size="xs"
|
| 191 |
-
onclick={() => {
|
| 192 |
-
onSave({ ...model, temperature, max_tokens, top_p, provider });
|
| 193 |
-
open = false;
|
| 194 |
-
}}>Save Settings</Button
|
| 195 |
-
>
|
| 196 |
-
</footer>
|
| 197 |
</div>
|
| 198 |
</Popover.Content>
|
| 199 |
</Popover.Root>
|
|
|
|
| 45 |
});
|
| 46 |
</script>
|
| 47 |
|
| 48 |
+
<Popover.Root
|
| 49 |
+
bind:open
|
| 50 |
+
onOpenChange={(value) => !value && onSave({ ...model, temperature, max_tokens, top_p, provider })}
|
| 51 |
+
>
|
| 52 |
<Popover.Trigger>{@render children?.()}</Popover.Trigger>
|
| 53 |
<Popover.Content class="w-80 rounded-2xl p-0">
|
| 54 |
<div class="grid gap-4">
|
|
|
|
| 152 |
<header class="border-t border-border px-5 pt-4">
|
| 153 |
<h4 class="text-sm leading-none font-medium text-muted-foreground">Provider</h4>
|
| 154 |
</header>
|
| 155 |
+
<main class="w-full px-5 pb-5">
|
| 156 |
<Select.Root type="single" bind:value={provider}>
|
| 157 |
<Select.Trigger class="flex w-full items-center justify-between gap-2 capitalize">
|
| 158 |
<div class="flex items-center gap-2">
|
|
|
|
| 187 |
</Select.Content>
|
| 188 |
</Select.Root>
|
| 189 |
</main>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
</div>
|
| 191 |
</Popover.Content>
|
| 192 |
</Popover.Root>
|