+
{serverProps.chat_template}
diff --git a/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte b/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte
index a40501e2cc..14737f6472 100644
--- a/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte
+++ b/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte
@@ -164,6 +164,19 @@
let isOpen = $state(false);
let showModelDialog = $state(false);
+ let infoModelId = $state
(null);
+
+ // key of the first "available" (non-loaded, non-favourite) group
+ // used to render the "Available models" separator exactly once
+ let firstAvailableOrgKey = $derived.by(() => {
+ const g = groupedFilteredOptions.find((g) => !g.isLoadedGroup && !g.isFavouritesGroup);
+ return g ? (g.orgName ?? '') : null;
+ });
+
+ function handleInfoClick(modelName: string) {
+ infoModelId = modelName;
+ showModelDialog = true;
+ }
onMount(() => {
modelsStore.fetch().catch((error) => {
@@ -427,12 +440,19 @@
Favourite models
- {:else if group.orgName}
-
- {group.orgName}
-
+ {:else}
+ {#if (group.orgName ?? '') === firstAvailableOrgKey}
+
+ Available models
+
+ {/if}
+ {#if group.orgName}
+
+ {group.orgName}
+
+ {/if}
{/if}
{#each group.items as { option, flatIndex } (group.isLoadedGroup ? `loaded-${option.id}` : group.isFavouritesGroup ? `fav-${option.id}` : option.id)}
@@ -447,6 +467,7 @@
{isFav}
showOrgName={group.isFavouritesGroup || group.isLoadedGroup}
onSelect={handleSelect}
+ onInfoClick={handleInfoClick}
onMouseEnter={() => (highlightedIndex = flatIndex)}
onKeyDown={(e) => {
if (e.key === KeyboardKey.ENTER || e.key === KeyboardKey.SPACE) {
@@ -500,6 +521,6 @@
{/if}
-{#if showModelDialog && !isRouter}
-