Skip to content

Commit 5f89c1b

Browse files
committed
enh: model selector tag filter
1 parent 811e1f9 commit 5f89c1b

File tree

1 file changed

+68
-10
lines changed

1 file changed

+68
-10
lines changed

src/lib/components/chat/ModelSelector/Selector.svelte

Lines changed: 68 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,17 @@
5252
export let className = 'w-[32rem]';
5353
export let triggerClassName = 'text-lg';
5454
55+
let tagsContainerElement;
56+
5557
let show = false;
58+
let tags = [];
5659
5760
let selectedModel = '';
5861
$: selectedModel = items.find((item) => item.value === value) ?? '';
5962
6063
let searchValue = '';
64+
let selectedTag = '';
65+
6166
let ollamaVersion = null;
6267
6368
let selectedModelIdx = 0;
@@ -79,10 +84,23 @@
7984
);
8085
8186
$: filteredItems = searchValue
82-
? fuse.search(searchValue).map((e) => {
83-
return e.item;
84-
})
85-
: items;
87+
? fuse
88+
.search(searchValue)
89+
.map((e) => {
90+
return e.item;
91+
})
92+
.filter((item) => {
93+
if (selectedTag === '') {
94+
return true;
95+
}
96+
return item.model?.info?.meta?.tags?.map((tag) => tag.name).includes(selectedTag);
97+
})
98+
: items.filter((item) => {
99+
if (selectedTag === '') {
100+
return true;
101+
}
102+
return item.model?.info?.meta?.tags?.map((tag) => tag.name).includes(selectedTag);
103+
});
86104
87105
const pullModelHandler = async () => {
88106
const sanitizedModelTag = searchValue.trim().replace(/^ollama\s+(run|pull)\s+/, '');
@@ -214,6 +232,11 @@
214232
215233
onMount(async () => {
216234
ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
235+
236+
if (items) {
237+
tags = items.flatMap((item) => item.model?.info?.meta?.tags ?? []);
238+
tags = [...new Set(tags)].map((tag) => tag.name).sort();
239+
}
217240
});
218241
219242
const cancelModelPullHandler = async (model: string) => {
@@ -298,10 +321,43 @@
298321
/>
299322
</div>
300323

301-
<hr class="border-gray-100 dark:border-gray-850" />
324+
<hr class="border-gray-100 dark:border-gray-800" />
302325
{/if}
303326

304-
<div class="px-3 my-2 max-h-64 overflow-y-auto scrollbar-hidden group">
327+
<div class="px-3 my-2 max-h-64 overflow-y-auto scrollbar-hidden group relative">
328+
{#if tags}
329+
<div class=" flex w-full sticky">
330+
<div
331+
class="flex gap-1 scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-full bg-transparent px-1.5 pb-0.5"
332+
bind:this={tagsContainerElement}
333+
>
334+
<button
335+
class="min-w-fit outline-none p-1.5 {selectedTag === ''
336+
? ''
337+
: 'text-gray-300 dark:text-gray-600 hover:text-gray-700 dark:hover:text-white'} transition"
338+
on:click={() => {
339+
selectedTag = '';
340+
}}
341+
>
342+
{$i18n.t('All')}
343+
</button>
344+
345+
{#each tags as tag}
346+
<button
347+
class="min-w-fit outline-none p-1.5 {selectedTag === tag
348+
? ''
349+
: 'text-gray-300 dark:text-gray-600 hover:text-gray-700 dark:hover:text-white'} transition"
350+
on:click={() => {
351+
selectedTag = tag;
352+
}}
353+
>
354+
{tag}
355+
</button>
356+
{/each}
357+
</div>
358+
</div>
359+
{/if}
360+
305361
{#each filteredItems as item, index}
306362
<button
307363
aria-label="model-item"
@@ -441,11 +497,13 @@
441497
{/if}
442498

443499
{#if !$mobile && (item?.model?.info?.meta?.tags ?? []).length > 0}
444-
<div class="flex gap-0.5 self-center items-center h-full translate-y-[0.5px]">
500+
<div
501+
class="flex gap-0.5 self-center items-center h-full translate-y-[0.5px] overflow-x-auto scrollbar-none"
502+
>
445503
{#each item.model?.info?.meta.tags as tag}
446-
<Tooltip content={tag.name}>
504+
<Tooltip content={tag.name} className="flex-shrink-0">
447505
<div
448-
class=" text-xs font-bold px-1 rounded-sm uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
506+
class=" text-xs font-bold px-1 rounded-sm uppercase bg-gray-500/20 text-gray-700 dark:text-gray-200"
449507
>
450508
{tag.name}
451509
</div>
@@ -575,7 +633,7 @@
575633
</div>
576634

577635
{#if showTemporaryChatControl}
578-
<hr class="border-gray-100 dark:border-gray-850" />
636+
<hr class="border-gray-100 dark:border-gray-800" />
579637

580638
<div class="flex items-center mx-2 my-2">
581639
<button

0 commit comments

Comments
 (0)