diff --git a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfiguration.svelte b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfiguration.svelte index 7521840fec..62da41124d 100644 --- a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfiguration.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfiguration.svelte @@ -44,15 +44,18 @@ let loadProgress = $derived( isOperationInProgress ? modelsStore.status.getLoadProgress(option.model) : null ); - let contextMax = $derived( - option.contextLength ?? - serverProps?.default_generation_settings?.n_ctx ?? - LOAD_DEFAULTS.contextLength - ); // The server only reports the full metadata once a model is loaded, which loads // it. When discovery is on, the Hub fills those gaps instead. let hubDetails = $state(null); + // the window the model can take, from the listing or the Hub; a loaded model's runtime + // context only bounds it when nothing else says otherwise + let contextMax = $derived( + option.contextLength ?? + hubDetails?.gguf?.context_length ?? + serverProps?.default_generation_settings?.n_ctx ?? + LOAD_DEFAULTS.contextLength + ); $effect(() => { const repo = option.model.split(':')[0] ?? option.model; diff --git a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationInformation.svelte b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationInformation.svelte index 9ed8344556..afe502541c 100644 --- a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationInformation.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationInformation.svelte @@ -47,29 +47,29 @@ }; }); + // the window a model can take, from the listing or from the Hub + let contextLabel = $derived( + option.contextLength + ? `${formatParameters(option.contextLength)} tokens` + : hub?.gguf?.context_length + ? `${formatNumber(hub.gguf.context_length)} tokens` + : null + ); let meta = $derived(option.meta); // the server reports these once the model is loaded; the Hub knows them anyway let gguf = $derived(hub?.gguf ?? null); let modalities = $derived(modelsStore.props.getModelModalitiesArray(option.id)); - let isMissingContext = $derived(!serverProps); let rows = $derived([ { isCopyable: true, isMono: true, label: 'File Path', value: serverProps?.model_path ?? null }, { label: 'Context Size', + // the server reports the context it runs with once the model is loaded; until then + // the listing, or the Hub, still says what the model can take value: serverProps ? `${formatNumber(serverProps.default_generation_settings.n_ctx)} tokens` - : null - }, - { - label: 'Training Context', - value: meta?.n_ctx_train - ? `${formatNumber(meta.n_ctx_train)} tokens` - : option.contextLength - ? `${formatParameters(option.contextLength)} tokens` - : gguf?.context_length - ? `${formatNumber(gguf.context_length)} tokens` - : null + : (contextLabel ?? null) }, + { label: 'Training Context', value: contextLabel }, { label: 'Model Size', value: meta?.size ? formatFileSize(meta.size) : (resolvedSize ?? size) @@ -124,21 +124,11 @@ {#each rows as row (row.label)}
- {row.label} + {row.label} {#if row.value === null} - - {isMissingContext && row.label === 'Context Size' ? 'Not available' : '—'} - + — {:else}