Spaces:
Running
Running
fix
Browse files
src/lib/components/chat/Assistant.svelte
CHANGED
|
@@ -17,6 +17,8 @@
|
|
| 17 |
import Message from './Message.svelte';
|
| 18 |
import Spinner from '$lib/components/loading/Spinner.svelte';
|
| 19 |
import { formatUsageCost } from '$lib';
|
|
|
|
|
|
|
| 20 |
|
| 21 |
let { id }: NodeProps = $props();
|
| 22 |
|
|
@@ -25,7 +27,9 @@
|
|
| 25 |
const { update: updateNodes } = useNodes();
|
| 26 |
const { update: updateEdges } = useEdges();
|
| 27 |
|
| 28 |
-
let selectedModel = $derived
|
|
|
|
|
|
|
| 29 |
let messages = $derived((nodeData.current?.data.messages as ChatMessage[]) ?? []);
|
| 30 |
let loading = $derived((nodeData.current?.data.loading as boolean) ?? false);
|
| 31 |
let usage = $derived((nodeData.current?.data.usage as TokenUsage) ?? null);
|
|
@@ -122,11 +126,11 @@
|
|
| 122 |
class="group relative inline-flex h-8 shrink-0 items-center justify-center gap-1.5 rounded-md border bg-background px-3 text-sm font-normal! text-gray-600 has-[>svg]:px-2.5 dark:border-input dark:bg-input/30 dark:text-gray-400"
|
| 123 |
>
|
| 124 |
<img
|
| 125 |
-
src={`https://huggingface.co/api/avatars/${selectedModel.
|
| 126 |
-
alt={selectedModel.
|
| 127 |
class="size-3.5 rounded-full"
|
| 128 |
/>
|
| 129 |
-
{selectedModel.
|
| 130 |
</div>
|
| 131 |
</div>
|
| 132 |
</header>
|
|
@@ -141,14 +145,15 @@
|
|
| 141 |
{/if}
|
| 142 |
</div>
|
| 143 |
{#if usage && !loading && message}
|
| 144 |
-
{@const
|
|
|
|
| 145 |
<div class="mt-3 flex items-center justify-between gap-2 border-t border-border pt-3">
|
| 146 |
<p class="text-xs text-muted-foreground">
|
| 147 |
{usage.total_tokens} tokens
|
| 148 |
-
{#if formatUsageCost(
|
| 149 |
<span class="mx-0.5">·</span>
|
| 150 |
{formatUsageCost(
|
| 151 |
-
|
| 152 |
usage
|
| 153 |
)}
|
| 154 |
{/if}
|
|
@@ -160,8 +165,13 @@
|
|
| 160 |
<span class="inline-flex items-center gap-0.5">
|
| 161 |
Using
|
| 162 |
<span class="inline-flex items-center gap-1 rounded-full bg-muted py-0.5 pr-2 pl-1">
|
| 163 |
-
{#if
|
| 164 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
{:else}
|
| 166 |
<img
|
| 167 |
src={`https://huggingface.co/api/avatars/${provider}`}
|
|
|
|
| 17 |
import Message from './Message.svelte';
|
| 18 |
import Spinner from '$lib/components/loading/Spinner.svelte';
|
| 19 |
import { formatUsageCost } from '$lib';
|
| 20 |
+
import { modelsState } from '$lib/state/models.svelte';
|
| 21 |
+
import { PROVIDER_SELECTION_MODES } from '$lib/consts';
|
| 22 |
|
| 23 |
let { id }: NodeProps = $props();
|
| 24 |
|
|
|
|
| 27 |
const { update: updateNodes } = useNodes();
|
| 28 |
const { update: updateEdges } = useEdges();
|
| 29 |
|
| 30 |
+
let selectedModel = $derived<string | null>(
|
| 31 |
+
(nodeData.current?.data.selectedModel as string) ?? null
|
| 32 |
+
);
|
| 33 |
let messages = $derived((nodeData.current?.data.messages as ChatMessage[]) ?? []);
|
| 34 |
let loading = $derived((nodeData.current?.data.loading as boolean) ?? false);
|
| 35 |
let usage = $derived((nodeData.current?.data.usage as TokenUsage) ?? null);
|
|
|
|
| 126 |
class="group relative inline-flex h-8 shrink-0 items-center justify-center gap-1.5 rounded-md border bg-background px-3 text-sm font-normal! text-gray-600 has-[>svg]:px-2.5 dark:border-input dark:bg-input/30 dark:text-gray-400"
|
| 127 |
>
|
| 128 |
<img
|
| 129 |
+
src={`https://huggingface.co/api/avatars/${selectedModel?.split('/')[0]}`}
|
| 130 |
+
alt={selectedModel?.split('/')[0]}
|
| 131 |
class="size-3.5 rounded-full"
|
| 132 |
/>
|
| 133 |
+
{selectedModel?.split('/').pop() ?? selectedModel}
|
| 134 |
</div>
|
| 135 |
</div>
|
| 136 |
</header>
|
|
|
|
| 145 |
{/if}
|
| 146 |
</div>
|
| 147 |
{#if usage && !loading && message}
|
| 148 |
+
{@const modelSettings = modelsState.models.find((m) => m.id === selectedModel)}
|
| 149 |
+
{@const provider = modelSettings?.provider ?? 'auto'}
|
| 150 |
<div class="mt-3 flex items-center justify-between gap-2 border-t border-border pt-3">
|
| 151 |
<p class="text-xs text-muted-foreground">
|
| 152 |
{usage.total_tokens} tokens
|
| 153 |
+
{#if formatUsageCost(modelSettings?.providers.find((p) => p.provider === provider)?.pricing, usage)}
|
| 154 |
<span class="mx-0.5">·</span>
|
| 155 |
{formatUsageCost(
|
| 156 |
+
modelSettings?.providers.find((p) => p.provider === provider)?.pricing,
|
| 157 |
usage
|
| 158 |
)}
|
| 159 |
{/if}
|
|
|
|
| 165 |
<span class="inline-flex items-center gap-0.5">
|
| 166 |
Using
|
| 167 |
<span class="inline-flex items-center gap-1 rounded-full bg-muted py-0.5 pr-2 pl-1">
|
| 168 |
+
{#if PROVIDER_SELECTION_MODES.find((m) => m.value === provider)}
|
| 169 |
+
{@const mode = PROVIDER_SELECTION_MODES.find((m) => m.value === provider)!}
|
| 170 |
+
<span
|
| 171 |
+
class="inline-flex size-4 items-center justify-center rounded-full {mode.class}"
|
| 172 |
+
>
|
| 173 |
+
<mode.icon class="size-2.5 {mode.iconClass}" />
|
| 174 |
+
</span>
|
| 175 |
{:else}
|
| 176 |
<img
|
| 177 |
src={`https://huggingface.co/api/avatars/${provider}`}
|