Buckets:
| import { SvelteMap } from 'svelte/reactivity'; | |
| import type { ModelOption } from '$lib/types/models'; | |
| export interface ModelItem { | |
| option: ModelOption; | |
| flatIndex: number; | |
| } | |
| export interface OrgGroup { | |
| orgName: string | null; | |
| items: ModelItem[]; | |
| } | |
| export interface GroupedModelOptions { | |
| loaded: ModelItem[]; | |
| favorites: ModelItem[]; | |
| available: OrgGroup[]; | |
| } | |
| export function filterModelOptions(options: ModelOption[], searchTerm: string): ModelOption[] { | |
| const term = searchTerm.trim().toLowerCase(); | |
| if (!term) return options; | |
| return options.filter( | |
| (option) => | |
| option.model.toLowerCase().includes(term) || | |
| option.name?.toLowerCase().includes(term) || | |
| option.aliases?.some((alias: string) => alias.toLowerCase().includes(term)) || | |
| option.tags?.some((tag: string) => tag.toLowerCase().includes(term)) | |
| ); | |
| } | |
| export function groupModelOptions( | |
| filteredOptions: ModelOption[], | |
| favoriteIds: Set<string>, | |
| isModelLoaded: (model: string) => boolean | |
| ): GroupedModelOptions { | |
| // Loaded models | |
| const loaded: ModelItem[] = []; | |
| for (let i = 0; i < filteredOptions.length; i++) { | |
| if (isModelLoaded(filteredOptions[i].model)) { | |
| loaded.push({ option: filteredOptions[i], flatIndex: i }); | |
| } | |
| } | |
| // Favorites (excluding loaded) | |
| const loadedModelIds = new Set(loaded.map((item) => item.option.model)); | |
| const favorites: ModelItem[] = []; | |
| for (let i = 0; i < filteredOptions.length; i++) { | |
| if ( | |
| favoriteIds.has(filteredOptions[i].model) && | |
| !loadedModelIds.has(filteredOptions[i].model) | |
| ) { | |
| favorites.push({ option: filteredOptions[i], flatIndex: i }); | |
| } | |
| } | |
| // Available models grouped by org (excluding loaded and favorites) | |
| const available: OrgGroup[] = []; | |
| const orgGroups = new SvelteMap<string, ModelItem[]>(); | |
| for (let i = 0; i < filteredOptions.length; i++) { | |
| const option = filteredOptions[i]; | |
| if (loadedModelIds.has(option.model) || favoriteIds.has(option.model)) continue; | |
| const key = option.parsedId?.orgName ?? ''; | |
| if (!orgGroups.has(key)) orgGroups.set(key, []); | |
| orgGroups.get(key)!.push({ option, flatIndex: i }); | |
| } | |
| for (const [orgName, items] of orgGroups) { | |
| available.push({ orgName: orgName || null, items }); | |
| } | |
| return { loaded, favorites, available }; | |
| } | |
Xet Storage Details
- Size:
- 2.23 kB
- Xet hash:
- 2905de5b70a57c2d70cd8c8f3f27a80758ffc13de5c20239100531c1ff241335
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.