From a5c945940134b957dbad47790b5baafeecdac6c4 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 29 Jun 2026 10:40:36 -0500 Subject: [PATCH] refac --- .../workspace/Models/ModelEditor.svelte | 16 +- .../workspace/Models/TTSVoiceInput.svelte | 137 ++++++++++++++++++ 2 files changed, 150 insertions(+), 3 deletions(-) create mode 100644 src/lib/components/workspace/Models/TTSVoiceInput.svelte diff --git a/src/lib/components/workspace/Models/ModelEditor.svelte b/src/lib/components/workspace/Models/ModelEditor.svelte index 24bbc75edf..35240af4b0 100644 --- a/src/lib/components/workspace/Models/ModelEditor.svelte +++ b/src/lib/components/workspace/Models/ModelEditor.svelte @@ -10,6 +10,7 @@ import { getFunctions } from '$lib/apis/functions'; import { getModelsDefaults } from '$lib/apis/configs'; import { getBaseModelTags, getModelTags } from '$lib/apis/models'; + import { getVoices } from '$lib/apis/audio'; import AdvancedParams from '$lib/components/chat/Settings/Advanced/AdvancedParams.svelte'; import Tags from '$lib/components/common/Tags.svelte'; @@ -28,6 +29,7 @@ import BuiltinTools from './BuiltinTools.svelte'; import PromptSuggestions from './PromptSuggestions.svelte'; import TerminalSelector from './TerminalSelector.svelte'; + import TTSVoiceInput from './TTSVoiceInput.svelte'; import AccessControlModal from '../common/AccessControlModal.svelte'; import LockClosed from '$lib/components/icons/LockClosed.svelte'; @@ -108,6 +110,7 @@ let terminalId = ''; let tts = { voice: '' }; export let suggestionTags: { name: string }[] = []; + let voices: { id: string; name?: string }[] = []; const loadSuggestionTags = async () => { const res: string[] = await (preset ? getModelTags : getBaseModelTags)( @@ -116,6 +119,11 @@ suggestionTags = res.map((tag) => ({ name: tag })); }; + const loadVoices = async () => { + const res = await getVoices(localStorage.token).catch(() => null); + voices = res?.voices ?? []; + }; + const submitHandler = async () => { loading = true; @@ -267,6 +275,9 @@ if (suggestionTags.length === 0) { await loadSuggestionTags(); } + if (voices.length === 0) { + await loadVoices(); + } // Fetch admin-configured default model metadata so the editor // reflects the actual defaults rather than hardcoded values @@ -855,10 +866,9 @@ {$i18n.t('TTS Voice')} - diff --git a/src/lib/components/workspace/Models/TTSVoiceInput.svelte b/src/lib/components/workspace/Models/TTSVoiceInput.svelte new file mode 100644 index 0000000000..c6013c99c3 --- /dev/null +++ b/src/lib/components/workspace/Models/TTSVoiceInput.svelte @@ -0,0 +1,137 @@ + + + + + 0} + autocomplete="off" + on:focus={() => { + suggestionsOpen = true; + positionPopup(); + }} + on:input={() => { + suggestionsOpen = true; + positionPopup(); + }} + on:keydown={(event) => { + if (event.key === 'Escape') { + suggestionsOpen = false; + } + }} + on:blur={() => { + setTimeout(() => { + if (!popupElement?.contains(document.activeElement)) { + suggestionsOpen = false; + } + }, 0); + }} +/> + +{#if suggestionsOpen && filteredVoices.length > 0} +
+ {#each filteredVoices as voice (voice.id)} + + {/each} +
+{/if}