{#each processingDetails as detail (detail)}
{detail}
diff --git a/tools/server/webui/src/lib/components/app/chat/ChatScreen/ChatScreenWarning.svelte b/tools/server/webui/src/lib/components/app/chat/ChatScreen/ChatScreenWarning.svelte
deleted file mode 100644
index 8b8d916889..0000000000
--- a/tools/server/webui/src/lib/components/app/chat/ChatScreen/ChatScreenWarning.svelte
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
- Server `/props` endpoint not available - using cached data
-
-
-
-
- {serverLoading() ? 'Checking...' : 'Retry'}
-
-
-
-
diff --git a/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettings.svelte b/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettings.svelte
index 204f0d7551..67df20439c 100644
--- a/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettings.svelte
+++ b/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettings.svelte
@@ -17,7 +17,7 @@
ChatSettingsFields
} from '$lib/components/app';
import { ScrollArea } from '$lib/components/ui/scroll-area';
- import { config, updateMultipleConfig } from '$lib/stores/settings.svelte';
+ import { config, settingsStore } from '$lib/stores/settings.svelte';
import { setMode } from 'mode-watcher';
import type { Component } from 'svelte';
@@ -79,19 +79,14 @@
title: 'Display',
icon: Monitor,
fields: [
- {
- key: 'showThoughtInProgress',
- label: 'Show thought in progress',
- type: 'checkbox'
- },
{
key: 'showMessageStats',
label: 'Show message generation statistics',
type: 'checkbox'
},
{
- key: 'showTokensPerSecond',
- label: 'Show tokens per second',
+ key: 'showThoughtInProgress',
+ label: 'Show thought in progress',
type: 'checkbox'
},
{
@@ -100,19 +95,20 @@
type: 'checkbox'
},
{
- key: 'showModelInfo',
- label: 'Show model information',
+ key: 'autoMicOnEmpty',
+ label: 'Show microphone on empty input',
+ type: 'checkbox',
+ isExperimental: true
+ },
+ {
+ key: 'renderUserContentAsMarkdown',
+ label: 'Render user content as Markdown',
type: 'checkbox'
},
{
key: 'disableAutoScroll',
label: 'Disable automatic scroll',
type: 'checkbox'
- },
- {
- key: 'renderUserContentAsMarkdown',
- label: 'Render user content as Markdown',
- type: 'checkbox'
}
]
},
@@ -232,11 +228,6 @@
title: 'Developer',
icon: Code,
fields: [
- {
- key: 'modelSelectorEnabled',
- label: 'Enable model selector',
- type: 'checkbox'
- },
{
key: 'showToolCalls',
label: 'Show tool call labels',
@@ -342,7 +333,7 @@
}
}
- updateMultipleConfig(processedConfig);
+ settingsStore.updateMultipleConfig(processedConfig);
onSave?.();
}
diff --git a/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFields.svelte b/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFields.svelte
index f297985a55..305687decb 100644
--- a/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFields.svelte
+++ b/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFields.svelte
@@ -6,8 +6,7 @@
import * as Select from '$lib/components/ui/select';
import { Textarea } from '$lib/components/ui/textarea';
import { SETTING_CONFIG_DEFAULT, SETTING_CONFIG_INFO } from '$lib/constants/settings-config';
- import { supportsVision } from '$lib/stores/server.svelte';
- import { getParameterInfo, resetParameterToServerDefault } from '$lib/stores/settings.svelte';
+ import { settingsStore } from '$lib/stores/settings.svelte';
import { ParameterSyncService } from '$lib/services/parameter-sync';
import { ChatSettingsParameterSourceIndicator } from '$lib/components/app';
import type { Component } from 'svelte';
@@ -27,7 +26,7 @@
return null;
}
- return getParameterInfo(key);
+ return settingsStore.getParameterInfo(key);
}
@@ -82,7 +81,7 @@
{
- resetParameterToServerDefault(field.key);
+ settingsStore.resetParameterToServerDefault(field.key);
// Trigger UI update by calling onConfigChange with the default value
const defaultValue = propsDefault ?? SETTING_CONFIG_DEFAULT[field.key];
onConfigChange(field.key, String(defaultValue));
@@ -175,7 +174,7 @@
{
- resetParameterToServerDefault(field.key);
+ settingsStore.resetParameterToServerDefault(field.key);
// Trigger UI update by calling onConfigChange with the default value
const defaultValue = propsDefault ?? SETTING_CONFIG_DEFAULT[field.key];
onConfigChange(field.key, String(defaultValue));
@@ -210,13 +209,10 @@
{/if}
{:else if field.type === 'checkbox'}
- {@const isDisabled = field.key === 'pdfAsImage' && !supportsVision()}
-
onConfigChange(field.key, checked)}
class="mt-1"
/>
@@ -224,9 +220,7 @@
{field.label}
@@ -239,11 +233,6 @@
{field.help || SETTING_CONFIG_INFO[field.key]}
- {:else if field.key === 'pdfAsImage' && !supportsVision()}
-
- PDF-to-image processing requires a vision-capable model. PDFs will be processed as
- text.
-
{/if}
diff --git a/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFooter.svelte b/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFooter.svelte
index 4f2d978ab8..1f7eb4e752 100644
--- a/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFooter.svelte
+++ b/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFooter.svelte
@@ -1,7 +1,7 @@
+
+
+
+
+
+
+ Model Not Available
+
+
+
+ The requested model could not be found. Select an available model to continue.
+
+
+
+
+
+
+ Requested: {modelName}
+
+
+
+ {#if availableModels.length > 0}
+
+
Select an available model:
+
+ {#each availableModels as model (model)}
+
handleSelectModel(model)}
+ >
+ {model}
+
+
+ {/each}
+
+
+ {/if}
+
+
+
+ handleOpenChange(false)}>Cancel
+
+
+
diff --git a/tools/server/webui/src/lib/components/app/index.ts b/tools/server/webui/src/lib/components/app/index.ts
index 6e55abe4e9..cf4d7495e2 100644
--- a/tools/server/webui/src/lib/components/app/index.ts
+++ b/tools/server/webui/src/lib/components/app/index.ts
@@ -25,7 +25,6 @@ export { default as ChatMessages } from './chat/ChatMessages/ChatMessages.svelte
export { default as ChatScreen } from './chat/ChatScreen/ChatScreen.svelte';
export { default as ChatScreenHeader } from './chat/ChatScreen/ChatScreenHeader.svelte';
export { default as ChatScreenProcessingInfo } from './chat/ChatScreen/ChatScreenProcessingInfo.svelte';
-export { default as ChatScreenWarning } from './chat/ChatScreen/ChatScreenWarning.svelte';
export { default as ChatSettings } from './chat/ChatSettings/ChatSettings.svelte';
export { default as ChatSettingsFooter } from './chat/ChatSettings/ChatSettingsFooter.svelte';
@@ -48,6 +47,7 @@ export { default as DialogConversationSelection } from './dialogs/DialogConversa
export { default as DialogConversationTitleUpdate } from './dialogs/DialogConversationTitleUpdate.svelte';
export { default as DialogEmptyFileAlert } from './dialogs/DialogEmptyFileAlert.svelte';
export { default as DialogModelInformation } from './dialogs/DialogModelInformation.svelte';
+export { default as DialogModelNotAvailable } from './dialogs/DialogModelNotAvailable.svelte';
// Miscellanous
@@ -55,14 +55,15 @@ export { default as ActionButton } from './misc/ActionButton.svelte';
export { default as ActionDropdown } from './misc/ActionDropdown.svelte';
export { default as BadgeChatStatistic } from './misc/BadgeChatStatistic.svelte';
export { default as BadgeInfo } from './misc/BadgeInfo.svelte';
-export { default as BadgeModelName } from './misc/BadgeModelName.svelte';
+export { default as ModelBadge } from './models/ModelBadge.svelte';
export { default as BadgeModality } from './misc/BadgeModality.svelte';
export { default as ConversationSelection } from './misc/ConversationSelection.svelte';
export { default as CopyToClipboardIcon } from './misc/CopyToClipboardIcon.svelte';
export { default as KeyboardShortcutInfo } from './misc/KeyboardShortcutInfo.svelte';
export { default as MarkdownContent } from './misc/MarkdownContent.svelte';
export { default as RemoveButton } from './misc/RemoveButton.svelte';
-export { default as SelectorModel } from './misc/SelectorModel.svelte';
+export { default as SyntaxHighlightedCode } from './misc/SyntaxHighlightedCode.svelte';
+export { default as ModelsSelector } from './models/ModelsSelector.svelte';
// Server
diff --git a/tools/server/webui/src/lib/components/app/misc/ActionButton.svelte b/tools/server/webui/src/lib/components/app/misc/ActionButton.svelte
index 11c4679a6e..411a8b6094 100644
--- a/tools/server/webui/src/lib/components/app/misc/ActionButton.svelte
+++ b/tools/server/webui/src/lib/components/app/misc/ActionButton.svelte
@@ -1,7 +1,6 @@
-
+
e.stopPropagation()}
>
{#if triggerTooltip}
-
+
{@render iconComponent(triggerIcon, 'h-3 w-3')}
{triggerTooltip}
diff --git a/tools/server/webui/src/lib/components/app/misc/BadgeChatStatistic.svelte b/tools/server/webui/src/lib/components/app/misc/BadgeChatStatistic.svelte
index e58d8564d8..9e5339cab5 100644
--- a/tools/server/webui/src/lib/components/app/misc/BadgeChatStatistic.svelte
+++ b/tools/server/webui/src/lib/components/app/misc/BadgeChatStatistic.svelte
@@ -1,5 +1,6 @@
-
+
{#snippet icon()}
{/snippet}
diff --git a/tools/server/webui/src/lib/components/app/misc/BadgeModality.svelte b/tools/server/webui/src/lib/components/app/misc/BadgeModality.svelte
index 3610197fdd..a0d5e863c2 100644
--- a/tools/server/webui/src/lib/components/app/misc/BadgeModality.svelte
+++ b/tools/server/webui/src/lib/components/app/misc/BadgeModality.svelte
@@ -1,8 +1,10 @@
-{#each modalities as modality, index (index)}
- {@const IconComponent = getModalityIcon(modality)}
+{#each displayableModalities as modality, index (index)}
+ {@const IconComponent = MODALITY_ICONS[modality]}
+ {@const label = MODALITY_LABELS[modality]}
{/if}
- {getModalityLabel(modality)}
+ {label}
{/each}
diff --git a/tools/server/webui/src/lib/components/app/misc/CopyToClipboardIcon.svelte b/tools/server/webui/src/lib/components/app/misc/CopyToClipboardIcon.svelte
index 6e4454b63f..bf6cd4fb28 100644
--- a/tools/server/webui/src/lib/components/app/misc/CopyToClipboardIcon.svelte
+++ b/tools/server/webui/src/lib/components/app/misc/CopyToClipboardIcon.svelte
@@ -1,6 +1,6 @@
+
+
+
{@html highlightedHtml}
+
+
+
diff --git a/tools/server/webui/src/lib/components/app/misc/BadgeModelName.svelte b/tools/server/webui/src/lib/components/app/models/ModelBadge.svelte
similarity index 85%
rename from tools/server/webui/src/lib/components/app/misc/BadgeModelName.svelte
rename to tools/server/webui/src/lib/components/app/models/ModelBadge.svelte
index a8e3822237..bea1bf6e3f 100644
--- a/tools/server/webui/src/lib/components/app/misc/BadgeModelName.svelte
+++ b/tools/server/webui/src/lib/components/app/models/ModelBadge.svelte
@@ -1,9 +1,9 @@
@@ -41,7 +41,7 @@
{#if model && isModelMode}
{#if showTooltip}
-
+
{@render badgeContent()}
diff --git a/tools/server/webui/src/lib/components/app/misc/SelectorModel.svelte b/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte
similarity index 55%
rename from tools/server/webui/src/lib/components/app/misc/SelectorModel.svelte
rename to tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte
index 73227a706e..64265e4f91 100644
--- a/tools/server/webui/src/lib/components/app/misc/SelectorModel.svelte
+++ b/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte
@@ -1,26 +1,44 @@
@@ -357,20 +485,100 @@
{/if}
{#each options as option (option.id)}
- handleSelect(option.id)}
+ aria-selected={isSelected}
+ aria-disabled={!isCompatible}
+ tabindex={isCompatible ? 0 : -1}
+ onclick={() => isCompatible && handleSelect(option.id)}
+ onkeydown={(e) => {
+ if (isCompatible && (e.key === 'Enter' || e.key === ' ')) {
+ e.preventDefault();
+ handleSelect(option.id);
+ }
+ }}
>
- {option.model}
-
+ {option.model}
+
+ {#if missingModalities}
+
+ {#if missingModalities.vision}
+
+
+
+
+
+ No vision support
+
+
+ {/if}
+ {#if missingModalities.audio}
+
+
+
+
+
+ No audio support
+
+
+ {/if}
+
+ {/if}
+
+ {#if isLoading}
+
+
+
+
+
+ Loading model...
+
+
+ {:else if isLoaded}
+
+
+ {
+ e.stopPropagation();
+ modelsStore.unloadModel(option.model);
+ }}
+ >
+
+
+
+
+
+ Unload model
+
+
+ {:else}
+
+ {/if}
+