diff --git a/src/lib/components/chat/ModelSelector/ModelItem.svelte b/src/lib/components/chat/ModelSelector/ModelItem.svelte index 5dcf24443a..0103b896dc 100644 --- a/src/lib/components/chat/ModelSelector/ModelItem.svelte +++ b/src/lib/components/chat/ModelSelector/ModelItem.svelte @@ -26,7 +26,7 @@ export let selectedValues: string[] = []; export let compareEnabled = false; - export let unloadModelHandler: (modelValue: string) => void = () => {}; + export let unloadModelHandler: (model: any) => void = () => {}; export let pinModelHandler: (modelId: string) => void = () => {}; export let deleteModelHandler: (model: any) => void = () => {}; export let selectionOnly = false; @@ -44,6 +44,8 @@ } }; + const formatSize = (size?: number) => (size ? `(${(size / 1024 ** 3).toFixed(1)}GB)` : ''); + let showMenu = false; $: isSelected = compareEnabled ? selectedValues.includes(item.value) : value === item.value; @@ -128,6 +130,23 @@ {/if} + {:else if item.model.provider === 'lmstudio' || item.model.provider === 'llama.cpp'} + {@const parameterSize = item.model.params_string ?? item.model.details?.parameter_size ?? ''} + {@const quantization = + item.model.quantization?.name ?? item.model.details?.quantization_level ?? ''} + {@const size = item.model.size_bytes ?? item.model.size} + {#if parameterSize || quantization || size} +
+ + + {parameterSize || quantization || formatSize(size)} + + +
+ {/if} {/if} {#if item.model.loaded} @@ -256,7 +275,7 @@ on:click={(e) => { e.preventDefault(); e.stopPropagation(); - unloadModelHandler(item.value); + unloadModelHandler(item.model); }} > diff --git a/src/lib/components/chat/ModelSelector/ModelItemMenu.svelte b/src/lib/components/chat/ModelSelector/ModelItemMenu.svelte index 627e207cc6..830fa8fe4c 100644 --- a/src/lib/components/chat/ModelSelector/ModelItemMenu.svelte +++ b/src/lib/components/chat/ModelSelector/ModelItemMenu.svelte @@ -22,6 +22,8 @@ export let deleteModelHandler: Function = () => {}; export let onClose: Function = () => {}; + + const providerSupportsDelete = (provider = '') => provider === 'llama.cpp'; {$i18n.t('Edit')} - {#if $user?.role === 'admin' && model?.owned_by === 'ollama'} + {#if $user?.role === 'admin' && (model?.owned_by === 'ollama' || providerSupportsDelete(model?.provider))} - {:else} -
-
- {$i18n.t('No results found')} + {:else} +
+
+ {$i18n.t('No results found')} +
-
{/if} {:else} @@ -947,76 +1167,108 @@
{/if} - {#if showPullModelButton} - - - - {/if} - - {#each selectionOnly ? [] : Object.keys($MODEL_DOWNLOAD_POOL) as model} -
-
-
- -
- -
-
-
- Downloading "{model}" -
- -
- {'pullProgress' in $MODEL_DOWNLOAD_POOL[model] - ? `(${$MODEL_DOWNLOAD_POOL[model].pullProgress}%)` - : ''} + {#each downloadTargets as target, targetIndex (target.id)} + {#if target.download} + +
+ +
+ {$i18n.t('Downloading "{{searchValue}}"', { searchValue: searchValue })}
+ {#if 'pullProgress' in target.download} +
+ {target.download.pullProgress}% +
+ {/if} +
+
+ {:else} + + + + {/if} + {/each} - {#if 'digest' in $MODEL_DOWNLOAD_POOL[model] && $MODEL_DOWNLOAD_POOL[model].digest} -
- {$MODEL_DOWNLOAD_POOL[model].digest} + {#each selectionOnly ? [] : Object.keys($MODEL_DOWNLOAD_POOL).filter((model) => !activeDownloadKeys.has(model)) as model} + {@const download = $MODEL_DOWNLOAD_POOL[model]} + {@const downloadName = download?.model ?? model} + +
+ +
+ Downloading "{downloadName}"{download?.providerLabel + ? ` from ${download.providerLabel}` + : ''} +
+ {#if 'pullProgress' in download} +
+ {download.pullProgress}%
{/if} -
-
- -
- - -
-
- {/each} +
+ + {/each}
{#if showSetDefault}