Spaces:
Running
Running
ui for persona
Browse files
src/lib/components/chat/Assistant.svelte
CHANGED
|
@@ -17,7 +17,7 @@
|
|
| 17 |
import { Button } from '$lib/components/ui/button';
|
| 18 |
import Message from './Message.svelte';
|
| 19 |
import Spinner from '$lib/components/loading/Spinner.svelte';
|
| 20 |
-
import { formatUsageCost, getProviderName } from '$lib';
|
| 21 |
import { modelsState } from '$lib/state/models.svelte';
|
| 22 |
import ListModels from '$lib/components/model/ListModels.svelte';
|
| 23 |
import { DEFAULT_PERSONA, personasState } from '$lib/state/personas.svelte';
|
|
@@ -35,9 +35,9 @@
|
|
| 35 |
let loading = $derived((nodeData.current?.data.loading as boolean) ?? false);
|
| 36 |
let usage = $derived((nodeData.current?.data.usage as TokenUsage) ?? null);
|
| 37 |
let persona = $derived(
|
| 38 |
-
nodeData.current?.data.
|
| 39 |
-
?
|
| 40 |
-
:
|
| 41 |
);
|
| 42 |
|
| 43 |
let message = $derived(
|
|
@@ -157,11 +157,11 @@
|
|
| 157 |
</div>
|
| 158 |
{#if persona}
|
| 159 |
<div
|
| 160 |
-
class="inline-flex max-w-max items-center gap-
|
|
|
|
|
|
|
| 161 |
>
|
| 162 |
-
<
|
| 163 |
-
<Drama class="size-3" />
|
| 164 |
-
</span>
|
| 165 |
{persona.name}
|
| 166 |
</div>
|
| 167 |
{/if}
|
|
|
|
| 17 |
import { Button } from '$lib/components/ui/button';
|
| 18 |
import Message from './Message.svelte';
|
| 19 |
import Spinner from '$lib/components/loading/Spinner.svelte';
|
| 20 |
+
import { formatUsageCost, getAvatarClass, getProviderName } from '$lib';
|
| 21 |
import { modelsState } from '$lib/state/models.svelte';
|
| 22 |
import ListModels from '$lib/components/model/ListModels.svelte';
|
| 23 |
import { DEFAULT_PERSONA, personasState } from '$lib/state/personas.svelte';
|
|
|
|
| 35 |
let loading = $derived((nodeData.current?.data.loading as boolean) ?? false);
|
| 36 |
let usage = $derived((nodeData.current?.data.usage as TokenUsage) ?? null);
|
| 37 |
let persona = $derived(
|
| 38 |
+
nodeData.current?.data.persona === DEFAULT_PERSONA.id
|
| 39 |
+
? null
|
| 40 |
+
: personasState.personas.find((p) => p.id === nodeData.current?.data.persona)
|
| 41 |
);
|
| 42 |
|
| 43 |
let message = $derived(
|
|
|
|
| 157 |
</div>
|
| 158 |
{#if persona}
|
| 159 |
<div
|
| 160 |
+
class="inline-flex max-w-max items-center gap-1 rounded-md px-2 py-1 text-xs {getAvatarClass(
|
| 161 |
+
persona.name
|
| 162 |
+
)}"
|
| 163 |
>
|
| 164 |
+
<Drama class="size-3" />
|
|
|
|
|
|
|
| 165 |
{persona.name}
|
| 166 |
</div>
|
| 167 |
{/if}
|
src/lib/components/chat/Welcome.svelte
CHANGED
|
@@ -1,5 +1,4 @@
|
|
| 1 |
<script lang="ts">
|
| 2 |
-
import { useNodes, useNodesData, type NodeProps } from '@xyflow/svelte';
|
| 3 |
import { fly } from 'svelte/transition';
|
| 4 |
|
| 5 |
import HFLogo from '$lib/assets/hf-logo.svg';
|
|
|
|
| 1 |
<script lang="ts">
|
|
|
|
| 2 |
import { fly } from 'svelte/transition';
|
| 3 |
|
| 4 |
import HFLogo from '$lib/assets/hf-logo.svg';
|
src/lib/components/flow/actions/PersonasModal.svelte
CHANGED
|
@@ -14,6 +14,7 @@
|
|
| 14 |
} from '$lib/state/personas.svelte';
|
| 15 |
import { Input } from '$lib/components/ui/input';
|
| 16 |
import type { Persona } from '$lib/state/personas.svelte';
|
|
|
|
| 17 |
|
| 18 |
// bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-300
|
| 19 |
// bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300
|
|
@@ -21,14 +22,6 @@
|
|
| 21 |
// bg-sky-100 text-sky-700 dark:bg-sky-900/30 dark:text-sky-300
|
| 22 |
// bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-300
|
| 23 |
// bg-slate-100 text-slate-600 dark:bg-slate-700/50 dark:text-slate-300
|
| 24 |
-
const AVATAR_CLASSES = [
|
| 25 |
-
'bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-300',
|
| 26 |
-
'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300',
|
| 27 |
-
'bg-teal-100 text-teal-700 dark:bg-teal-900/30 dark:text-teal-300',
|
| 28 |
-
'bg-sky-100 text-sky-700 dark:bg-sky-900/30 dark:text-sky-300',
|
| 29 |
-
'bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-300',
|
| 30 |
-
'bg-slate-100 text-slate-600 dark:bg-slate-700/50 dark:text-slate-300'
|
| 31 |
-
];
|
| 32 |
|
| 33 |
let open = $state(false);
|
| 34 |
let openFormPersona = $state.raw<string | null>(null);
|
|
@@ -70,22 +63,6 @@
|
|
| 70 |
}
|
| 71 |
openFormPersona = null;
|
| 72 |
}
|
| 73 |
-
|
| 74 |
-
function getInitials(name: string): string {
|
| 75 |
-
return name
|
| 76 |
-
.split(' ')
|
| 77 |
-
.slice(0, 2)
|
| 78 |
-
.map((w) => w[0]?.toUpperCase() ?? '')
|
| 79 |
-
.join('');
|
| 80 |
-
}
|
| 81 |
-
|
| 82 |
-
function getAvatarClass(name: string): string {
|
| 83 |
-
let hash = 0;
|
| 84 |
-
for (let i = 0; i < name.length; i++) {
|
| 85 |
-
hash = name.charCodeAt(i) + ((hash << 5) - hash);
|
| 86 |
-
}
|
| 87 |
-
return AVATAR_CLASSES[Math.abs(hash) % AVATAR_CLASSES.length];
|
| 88 |
-
}
|
| 89 |
</script>
|
| 90 |
|
| 91 |
<Sheet.Root bind:open>
|
|
|
|
| 14 |
} from '$lib/state/personas.svelte';
|
| 15 |
import { Input } from '$lib/components/ui/input';
|
| 16 |
import type { Persona } from '$lib/state/personas.svelte';
|
| 17 |
+
import { getAvatarClass, getInitials } from '$lib';
|
| 18 |
|
| 19 |
// bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-300
|
| 20 |
// bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300
|
|
|
|
| 22 |
// bg-sky-100 text-sky-700 dark:bg-sky-900/30 dark:text-sky-300
|
| 23 |
// bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-300
|
| 24 |
// bg-slate-100 text-slate-600 dark:bg-slate-700/50 dark:text-slate-300
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
|
| 26 |
let open = $state(false);
|
| 27 |
let openFormPersona = $state.raw<string | null>(null);
|
|
|
|
| 63 |
}
|
| 64 |
openFormPersona = null;
|
| 65 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
</script>
|
| 67 |
|
| 68 |
<Sheet.Root bind:open>
|
src/lib/index.ts
CHANGED
|
@@ -33,3 +33,28 @@ export function getProviderName(provider: string) {
|
|
| 33 |
};
|
| 34 |
return providersMap[provider as keyof typeof providersMap] ?? provider;
|
| 35 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
};
|
| 34 |
return providersMap[provider as keyof typeof providersMap] ?? provider;
|
| 35 |
}
|
| 36 |
+
|
| 37 |
+
export function getInitials(name: string): string {
|
| 38 |
+
return name
|
| 39 |
+
.split(' ')
|
| 40 |
+
.slice(0, 2)
|
| 41 |
+
.map((w) => w[0]?.toUpperCase() ?? '')
|
| 42 |
+
.join('');
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
export function getAvatarClass(name: string): string {
|
| 46 |
+
let hash = 0;
|
| 47 |
+
for (let i = 0; i < name.length; i++) {
|
| 48 |
+
hash = name.charCodeAt(i) + ((hash << 5) - hash);
|
| 49 |
+
}
|
| 50 |
+
return AVATAR_CLASSES[Math.abs(hash) % AVATAR_CLASSES.length];
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
export const AVATAR_CLASSES = [
|
| 54 |
+
'bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-300',
|
| 55 |
+
'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300',
|
| 56 |
+
'bg-teal-100 text-teal-700 dark:bg-teal-900/30 dark:text-teal-300',
|
| 57 |
+
'bg-sky-100 text-sky-700 dark:bg-sky-900/30 dark:text-sky-300',
|
| 58 |
+
'bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-300',
|
| 59 |
+
'bg-slate-100 text-slate-600 dark:bg-slate-700/50 dark:text-slate-300'
|
| 60 |
+
];
|