diff --git a/tools/ui/src/lib/components/app/dialogs/DialogModelInformation.svelte b/tools/ui/src/lib/components/app/dialogs/DialogModelInformation.svelte
deleted file mode 100644
index e200c004e5..0000000000
--- a/tools/ui/src/lib/components/app/dialogs/DialogModelInformation.svelte
+++ /dev/null
@@ -1,369 +0,0 @@
-
-
-
-
-
-
-
-
-
- Model Information
-
- Current model details and capabilities
-
-
- {#if isLoadingModels || isLoadingRouterProps}
-
-
Loading model information...
-
- {:else if firstModel}
- {@const modelMeta = firstModel.meta}
-
- {#if serverProps}
-
-
-
-
- Model
-
-
-
-
-
-
-
-
-
-
- File Path
-
-
-
-
- {serverProps.model_path}
-
-
-
-
-
-
-
-
- {#if serverProps?.default_generation_settings?.n_ctx}
-
- Context Size
-
- {formatNumber(serverProps.default_generation_settings.n_ctx)} tokens
-
- {:else}
-
- Context Size
-
- Not available
-
- {/if}
-
-
- {#if modelMeta?.n_ctx_train}
-
- Training Context
-
- {formatNumber(modelMeta.n_ctx_train)} tokens
-
- {/if}
-
-
- {#if modelMeta?.size}
-
- Model Size
-
- {formatFileSize(modelMeta.size)}
-
- {/if}
-
-
- {#if modelMeta?.n_params}
-
- Parameters
-
- {formatParameters(modelMeta.n_params)}
-
- {/if}
-
-
- {#if modelMeta?.n_embd}
-
- Embedding Size
-
- {formatNumber(modelMeta.n_embd)}
-
- {/if}
-
-
- {#if modelMeta?.n_vocab}
-
- Vocabulary Size
-
- {formatNumber(modelMeta.n_vocab)} tokens
-
- {/if}
-
-
- {#if modelMeta?.vocab_type}
-
- Vocabulary Type
-
- {modelMeta.vocab_type}
-
- {/if}
-
-
-
- Parallel Slots
-
- {serverProps.total_slots}
-
-
-
- {#if modalities.length > 0}
-
- Modalities
-
-
-
-
-
-
-
- {/if}
-
-
-
- Build Info
-
- {serverProps.build_info}
-
-
-
- {#if serverProps.chat_template}
-
-
-
-
Chat Template
-
-
-
{serverProps.chat_template}
-
-
-
-
- {/if}
-
-
-
-
-
-
-
-
-
File Path
-
-
-
{serverProps.model_path}
-
-
-
-
-
- {#if serverProps?.default_generation_settings?.n_ctx}
- {@render infoRow(
- 'Context Size',
- `${formatNumber(serverProps.default_generation_settings.n_ctx)} tokens`
- )}
- {:else}
- {@render infoRow('Context Size', 'Not available', 'text-red-500')}
- {/if}
-
- {#if modelMeta?.n_ctx_train}
- {@render infoRow('Training Context', `${formatNumber(modelMeta.n_ctx_train)} tokens`)}
- {/if}
-
- {#if modelMeta?.size}
- {@render infoRow('Model Size', formatFileSize(modelMeta.size))}
- {/if}
-
- {#if modelMeta?.n_params}
- {@render infoRow('Parameters', formatParameters(modelMeta.n_params))}
- {/if}
-
- {#if modelMeta?.n_embd}
- {@render infoRow('Embedding Size', formatNumber(modelMeta.n_embd))}
- {/if}
-
- {#if modelMeta?.n_vocab}
- {@render infoRow('Vocabulary Size', `${formatNumber(modelMeta.n_vocab)} tokens`)}
- {/if}
-
- {#if modelMeta?.vocab_type}
- {@render infoRow('Vocabulary Type', modelMeta.vocab_type, 'capitalize')}
- {/if}
-
- {@render infoRow('Parallel Slots', `${serverProps.total_slots}`)}
-
- {#if modalities.length > 0}
-
- {/if}
-
-
-
Build Info
-
-
{serverProps.build_info}
-
-
- {#if serverProps.chat_template}
-
-
Chat Template
-
-
-
{serverProps.chat_template}
-
-
- {/if}
-
- {/if}
- {:else if !isLoadingModels}
-
-
No model information available
-
- {/if}
-
-
-
-
-{#snippet infoRow(label: string, value: string, valueClass: string = '')}
-
- {label}
-
- {value}
-
-{/snippet}
diff --git a/tools/ui/src/lib/components/app/dialogs/index.ts b/tools/ui/src/lib/components/app/dialogs/index.ts
index f18638e0d2..5f23a5009d 100644
--- a/tools/ui/src/lib/components/app/dialogs/index.ts
+++ b/tools/ui/src/lib/components/app/dialogs/index.ts
@@ -454,7 +454,6 @@ export { default as DialogConversationSelection } from './DialogConversationSele
*
* ```
*/
-export { default as DialogModelInformation } from './DialogModelInformation.svelte';
/**
* **DialogMcpResourcesBrowser** - MCP resources browser dialog
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 a370e754e6..15c16aef98 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
@@ -1,10 +1,15 @@
+
+
Model
+
+
+ {option.model}
+
+
+
+
+
{#each rows as row (row.label)}
-
{row.label}
+
{row.label}
-
+
{#if row.value === null}
- —
- {:else if row.isBadge}
- {row.value}
+
+ {isMissingContext && row.label === 'Context Size' ? 'Not available' : '—'}
+
{:else}
- {row.value}
+
+ {#if row.isBadge}
+ {row.value}
+ {:else}
+ {row.value}
+ {/if}
+
+
+ {#if row.isCopyable}
+
+ {/if}
{/if}
{/each}
+
+ {#if modalities.length > 0}
+
+ Modalities
+
+
+
+ {/if}
diff --git a/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorDropdown.svelte b/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorDropdown.svelte
index 286f5ccdb2..5335205419 100644
--- a/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorDropdown.svelte
+++ b/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorDropdown.svelte
@@ -2,7 +2,6 @@
import ModelLoadHighlight from '../ModelLoadHighlight.svelte';
import { ChevronDown, Lightbulb, Loader2 } from '@lucide/svelte';
import {
- DialogModelInformation,
DropdownMenuSearchable,
ModelId,
ModelsSelectorList,
@@ -334,7 +333,6 @@
{isFav}
{isHighlighted}
{isSelected}
- onInfoClick={ms.handleInfoClick}
onKeyDown={(event) => {
if (event.key === KeyboardKey.ENTER || event.key === KeyboardKey.SPACE) {
event.preventDefault();
@@ -354,7 +352,6 @@
favorites={ms.favoriteItems}
groups={ms.groupedFilteredOptions}
loaded={ms.loadedItems}
- onInfoClick={ms.handleInfoClick}
onProviderBack={ms.isProviderView ? ms.closeProvider : undefined}
onProviderOpen={ms.openProvider}
onSelect={ms.handleSelect}
@@ -434,14 +431,6 @@
{/if}
-{#if ms.showModelDialog}
- ms.setShowModelDialog(v)}
- open={ms.showModelDialog}
- />
-{/if}
-
void ms.showBackendModels(backend.id)}
diff --git a/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorList.svelte b/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorList.svelte
index 8cd58135b8..f5886efa1c 100644
--- a/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorList.svelte
+++ b/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorList.svelte
@@ -20,7 +20,6 @@
activeId: string | null;
sectionHeaderClass?: string;
onSelect: (modelId: string) => void;
- onInfoClick: (modelName: string) => void;
renderOption?: import('svelte').Snippet<[ModelItem, boolean]>;
/** Favorite models of every backend, listed in their own section. */
favorites?: ModelItem[];
@@ -40,7 +39,6 @@
favorites = [],
groups,
loaded = [],
- onInfoClick,
onProviderBack,
onProviderOpen,
onSelect,
@@ -114,7 +112,6 @@
{isFav}
isHighlighted={false}
{isSelected}
- {onInfoClick}
onKeyDown={() => {}}
onMouseEnter={() => {}}
{onSelect}
diff --git a/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorOption.svelte b/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorOption.svelte
index 91b4857ce8..c7828875a1 100644
--- a/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorOption.svelte
+++ b/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorOption.svelte
@@ -17,7 +17,6 @@
onSelect: (modelId: string) => void;
onMouseEnter: () => void;
onKeyDown: (e: KeyboardEvent) => void;
- onInfoClick?: (modelName: string) => void;
/** Show the base model's org as the main avatar and the repo (quant) org as the corner badge; resolves the base org lazily via HF. */
showBaseModelAvatar?: boolean;
}
@@ -27,7 +26,6 @@
isFav,
isHighlighted,
isSelected,
- onInfoClick,
onKeyDown,
onMouseEnter,
onSelect,
@@ -103,7 +101,7 @@
/>
-
+
-{#if ms.showModelDialog}
- ms.setShowModelDialog(v)}
- open={ms.showModelDialog}
- />
-{/if}
-
void ms.showBackendModels(backend.id)}
diff --git a/tools/ui/src/lib/hooks/use-models-selector.svelte.ts b/tools/ui/src/lib/hooks/use-models-selector.svelte.ts
index ba92f8b818..ef8a5502c2 100644
--- a/tools/ui/src/lib/hooks/use-models-selector.svelte.ts
+++ b/tools/ui/src/lib/hooks/use-models-selector.svelte.ts
@@ -10,7 +10,7 @@ import {
LOCAL_BACKEND_ID,
REMOTE_PROVIDER_MODEL_LIMIT
} from '$lib/constants';
-import { backendsModelsStore, backendsStore, modelsStore, serverStore } from '$lib/stores';
+import { backendsModelsStore, backendsStore, modelsStore, serverStore, uiStore } from '$lib/stores';
import type { ModelOption } from '$lib/types/models';
import { getBackend } from '$lib/utils/api-base';
import { getBackendCapabilities } from '$lib/utils/backend';
@@ -53,14 +53,10 @@ export interface UseModelsSelectorReturn {
readonly groupedFilteredOptions: ReturnType;
readonly isLoadingModel: boolean;
readonly searchTerm: string;
- readonly showModelDialog: boolean;
- readonly infoModelId: string | null;
closeProvider(): void;
openProvider(backendId: string): void;
setSearchTerm(value: string): void;
showBackendModels(backendId: string): Promise;
- setShowModelDialog(value: boolean): void;
- handleInfoClick(modelName: string): void;
handleSelect(modelId: string): Promise;
handleOpenChange(open: boolean): void;
isFavorite(model: string): boolean;
@@ -124,8 +120,6 @@ export function useModelsSelector(opts: UseModelsSelectorOptions): UseModelsSele
let isLoadingModel = $state(false);
let searchTerm = $state('');
- let showModelDialog = $state(false);
- let infoModelId = $state(null);
const visibleOptions = $derived(allOptions.filter((option) => !modelsStore.isHidden(option.id)));
const filteredOptions = $derived(filterModelOptions(options, searchTerm));
@@ -196,11 +190,6 @@ export function useModelsSelector(opts: UseModelsSelectorOptions): UseModelsSele
);
const emptyMessage = $derived(searchTerm ? 'No models found.' : 'No models yet.');
- function handleInfoClick(modelName: string) {
- infoModelId = modelName;
- showModelDialog = true;
- }
-
onMount(() => {
modelsStore.fetch().catch((error) => {
console.error('Unable to load models:', error);
@@ -210,10 +199,10 @@ export function useModelsSelector(opts: UseModelsSelectorOptions): UseModelsSele
function handleOpenChange(open: boolean) {
if (loading || updating) return;
- // a single-model llama.cpp server with no other backend has no list to
- // show, so the trigger opens the model info dialog instead
+ // a single-model llama.cpp server with no other backend has no list to show,
+ // so the trigger opens the manager, which holds the one model's configuration
if (!isMultiModel) {
- showModelDialog = open;
+ if (open) uiStore.openModelsManager();
return;
}
@@ -362,16 +351,10 @@ export function useModelsSelector(opts: UseModelsSelectorOptions): UseModelsSele
return groupedFilteredOptions;
},
- handleInfoClick,
-
handleOpenChange,
handleSelect,
- get infoModelId() {
- return infoModelId;
- },
-
get isCurrentModelInCache() {
return isCurrentModelInCache;
},
@@ -430,16 +413,8 @@ export function useModelsSelector(opts: UseModelsSelectorOptions): UseModelsSele
searchTerm = value;
},
- setShowModelDialog(value: boolean) {
- showModelDialog = value;
- },
-
showBackendModels,
- get showModelDialog() {
- return showModelDialog;
- },
-
get updating() {
return updating;
}
diff --git a/tools/ui/tests/stories/ModelsSelector.stories.svelte b/tools/ui/tests/stories/ModelsSelector.stories.svelte
index 800d185f53..263d1ed010 100644
--- a/tools/ui/tests/stories/ModelsSelector.stories.svelte
+++ b/tools/ui/tests/stories/ModelsSelector.stories.svelte
@@ -126,7 +126,6 @@
currentModel={selectedModel}
favorites={favoriteModels}
groups={groupedOptions}
- onInfoClick={(modelName) => console.log('Info clicked:', modelName)}
onSelect={handleSelect}
/>
@@ -142,7 +141,6 @@
loaded: [loadedModels[0]],
providers: []
}}
- onInfoClick={(modelName) => console.log('Info clicked:', modelName)}
onSelect={handleSelect}
/>
@@ -159,7 +157,6 @@
loaded: [],
providers: []
}}
- onInfoClick={(modelName) => console.log('Info clicked:', modelName)}
onSelect={handleSelect}
/>