diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/cloudflare-workers-ai.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/cloudflare-workers-ai.vue new file mode 100644 index 000000000..3e124095b --- /dev/null +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/cloudflare-workers-ai.vue @@ -0,0 +1,97 @@ + + + + + + + + + + + + + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/deepseek.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/deepseek.vue new file mode 100644 index 000000000..72ae850c6 --- /dev/null +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/deepseek.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/elevenlabs.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/elevenlabs.vue index 73ac7c0e8..d0cda7641 100644 --- a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/elevenlabs.vue +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/elevenlabs.vue @@ -4,10 +4,18 @@ import type { RemovableRef } from '@vueuse/core' import type { UnElevenLabsOptions } from '@xsai-ext/providers-local' import type { SpeechProviderWithExtraOptions } from '@xsai-ext/shared-providers' -import { Collapsable, Range } from '@proj-airi/stage-ui/components' +import { + ProviderAdvancedSettings, + ProviderApiKeyInput, + ProviderBaseUrlInput, + ProviderBasicSettings, + ProviderCheckboxInput, + ProviderSettingsContainer, + ProviderSettingsLayout, + ProviderSliderInput, +} from '@proj-airi/stage-ui/components' import { voiceMap } from '@proj-airi/stage-ui/constants' import { useProvidersStore, useSpeechStore } from '@proj-airi/stage-ui/stores' -import { useToggle } from '@vueuse/core' import { generateSpeech } from '@xsai/generate-speech' import { storeToRefs } from 'pinia' import { computed, onMounted, onUnmounted, ref, watch } from 'vue' @@ -115,9 +123,6 @@ const selectedLanguage = ref(speechStore.selectedLanguage) const selectedVoice = ref(speechStore.voiceName) const availableVoices = computed(() => speechStore.availableVoicesForLanguage) -const advancedVisible = ref(false) -const toggleAdvancedVisible = useToggle(advancedVisible) - onMounted(() => { providersStore.initializeProvider(providerId) @@ -239,300 +244,173 @@ function handleResetVoiceSettings() { - - - - - - - Provider - - - {{ providerMetadata?.localizedName }} - - - - - - - - - - - Basic - - - Essential settings - - - - - - - - - - - API Key - * - - - API Key for {{ providerMetadata?.localizedName }} - - - - - - - - - - - Voice Settings - - - - - - - Similarity Boost - - - Voice similarity adherence - - - {{ similarityBoost.toFixed(2) }} - - - - - - - - - - - Stability - - - Voice stability and randomness - - - {{ stability.toFixed(2) }} - - - - - - - - - - - Speed - - - Speech generation speed - - - {{ speed.toFixed(2) }} - - - - - - - - - - - Style - - - Voice style exaggeration - - - {{ style.toFixed(2) }} - - - - - - - - - - - Speaker Boost - - - Enhance speaker similarity - - - {{ useSpeakerBoost ? 'On' : 'Off' }} - - - - - - - - - - - - slotProps.setVisible(!slotProps.visible) && toggleAdvancedVisible()" - > - - Advanced - - - - - - - - - - - Base URL - * - - - Custom base URL (optional) - - - - - - - - - - - - Voice Playground - - - + + + - - - - - Language - - - Select voice language - - - - - {{ language }} - - - + - - - - Voice + + + Voice Settings + + + + + + + + + + + + + + + + + + + + + + + Voice Playground + + + + + + + + Language + + + Select voice language + - - Select preferred voice + + + {{ language }} + + + + + + + + Voice + + + Select preferred voice + - - + + {{ voice.name }} + + + + + + - - {{ voice.name }} - - - + + + {{ isGenerating ? 'Generating...' : 'Test Voice' }} + + + + + + Stop + + + + + Please enter an API key to test the voice. + + + {{ errorMessage }} + + - - - - - {{ isGenerating ? 'Generating...' : 'Test Voice' }} - - - - - - Stop - - - - - Please enter an API key to test the voice. - - - {{ errorMessage }} - - - - - - + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/fireworks-ai.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/fireworks-ai.vue new file mode 100644 index 000000000..85e2e1579 --- /dev/null +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/fireworks-ai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/mistral-ai.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/mistral-ai.vue new file mode 100644 index 000000000..d8ce05811 --- /dev/null +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/mistral-ai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/moonshot-ai.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/moonshot-ai.vue new file mode 100644 index 000000000..0b4cf3fe8 --- /dev/null +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/moonshot-ai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/novita-ai.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/novita-ai.vue new file mode 100644 index 000000000..3a30194da --- /dev/null +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/novita-ai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/openai.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/openai.vue index a57f8261e..be6528d6f 100644 --- a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/openai.vue +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/openai.vue @@ -1,11 +1,17 @@ - - - - - - - Provider - - - {{ providerMetadata?.localizedName || 'OpenAI' }} - - - - - - - - - - Basic - - - Essential settings - - - - - - - - - - - API Key - * - - - API Key for {{ providerMetadata?.localizedName || 'OpenAI' }} - - - - - - - - - - - slotProps.setVisible(!slotProps.visible) && toggleAdvancedVisible()" - > - - Advanced - - - - - - - - - - - Base URL - - - Custom base URL (optional) - - - - - - - - - - - + + + + + + + + + + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/openrouter-ai.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/openrouter-ai.vue index 7fe35b984..260539bca 100644 --- a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/openrouter-ai.vue +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/openrouter-ai.vue @@ -1,11 +1,17 @@ - - - - - - - Provider - - - {{ providerMetadata?.localizedName }} - - - - - - - - - - Basic - - - Essential settings - - - - - - - - - - - API Key - * - - - API Key for {{ providerMetadata?.localizedName }} - - - - - - - - - - - slotProps.setVisible(!slotProps.visible) && toggleAdvancedVisible()" - > - - Advanced - - - - - - - - - - - Base URL - - - Custom base URL (optional) - - - - - - - - - - - + + + + + + + + + + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/together-ai.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/together-ai.vue new file mode 100644 index 000000000..85b14fbd6 --- /dev/null +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/together-ai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/xai.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/xai.vue new file mode 100644 index 000000000..a194366b0 --- /dev/null +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/xai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-web/src/pages/settings/providers/cloudflare-workers-ai.vue b/apps/stage-web/src/pages/settings/providers/cloudflare-workers-ai.vue new file mode 100644 index 000000000..3e124095b --- /dev/null +++ b/apps/stage-web/src/pages/settings/providers/cloudflare-workers-ai.vue @@ -0,0 +1,97 @@ + + + + + + + + + + + + + diff --git a/apps/stage-web/src/pages/settings/providers/deepseek.vue b/apps/stage-web/src/pages/settings/providers/deepseek.vue new file mode 100644 index 000000000..72ae850c6 --- /dev/null +++ b/apps/stage-web/src/pages/settings/providers/deepseek.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-web/src/pages/settings/providers/elevenlabs.vue b/apps/stage-web/src/pages/settings/providers/elevenlabs.vue index 73ac7c0e8..d0cda7641 100644 --- a/apps/stage-web/src/pages/settings/providers/elevenlabs.vue +++ b/apps/stage-web/src/pages/settings/providers/elevenlabs.vue @@ -4,10 +4,18 @@ import type { RemovableRef } from '@vueuse/core' import type { UnElevenLabsOptions } from '@xsai-ext/providers-local' import type { SpeechProviderWithExtraOptions } from '@xsai-ext/shared-providers' -import { Collapsable, Range } from '@proj-airi/stage-ui/components' +import { + ProviderAdvancedSettings, + ProviderApiKeyInput, + ProviderBaseUrlInput, + ProviderBasicSettings, + ProviderCheckboxInput, + ProviderSettingsContainer, + ProviderSettingsLayout, + ProviderSliderInput, +} from '@proj-airi/stage-ui/components' import { voiceMap } from '@proj-airi/stage-ui/constants' import { useProvidersStore, useSpeechStore } from '@proj-airi/stage-ui/stores' -import { useToggle } from '@vueuse/core' import { generateSpeech } from '@xsai/generate-speech' import { storeToRefs } from 'pinia' import { computed, onMounted, onUnmounted, ref, watch } from 'vue' @@ -115,9 +123,6 @@ const selectedLanguage = ref(speechStore.selectedLanguage) const selectedVoice = ref(speechStore.voiceName) const availableVoices = computed(() => speechStore.availableVoicesForLanguage) -const advancedVisible = ref(false) -const toggleAdvancedVisible = useToggle(advancedVisible) - onMounted(() => { providersStore.initializeProvider(providerId) @@ -239,300 +244,173 @@ function handleResetVoiceSettings() { - - - - - - - Provider - - - {{ providerMetadata?.localizedName }} - - - - - - - - - - - Basic - - - Essential settings - - - - - - - - - - - API Key - * - - - API Key for {{ providerMetadata?.localizedName }} - - - - - - - - - - - Voice Settings - - - - - - - Similarity Boost - - - Voice similarity adherence - - - {{ similarityBoost.toFixed(2) }} - - - - - - - - - - - Stability - - - Voice stability and randomness - - - {{ stability.toFixed(2) }} - - - - - - - - - - - Speed - - - Speech generation speed - - - {{ speed.toFixed(2) }} - - - - - - - - - - - Style - - - Voice style exaggeration - - - {{ style.toFixed(2) }} - - - - - - - - - - - Speaker Boost - - - Enhance speaker similarity - - - {{ useSpeakerBoost ? 'On' : 'Off' }} - - - - - - - - - - - - slotProps.setVisible(!slotProps.visible) && toggleAdvancedVisible()" - > - - Advanced - - - - - - - - - - - Base URL - * - - - Custom base URL (optional) - - - - - - - - - - - - Voice Playground - - - + + + - - - - - Language - - - Select voice language - - - - - {{ language }} - - - + - - - - Voice + + + Voice Settings + + + + + + + + + + + + + + + + + + + + + + + Voice Playground + + + + + + + + Language + + + Select voice language + - - Select preferred voice + + + {{ language }} + + + + + + + + Voice + + + Select preferred voice + - - + + {{ voice.name }} + + + + + + - - {{ voice.name }} - - - + + + {{ isGenerating ? 'Generating...' : 'Test Voice' }} + + + + + + Stop + + + + + Please enter an API key to test the voice. + + + {{ errorMessage }} + + - - - - - {{ isGenerating ? 'Generating...' : 'Test Voice' }} - - - - - - Stop - - - - - Please enter an API key to test the voice. - - - {{ errorMessage }} - - - - - - + diff --git a/apps/stage-web/src/pages/settings/providers/fireworks-ai.vue b/apps/stage-web/src/pages/settings/providers/fireworks-ai.vue new file mode 100644 index 000000000..85e2e1579 --- /dev/null +++ b/apps/stage-web/src/pages/settings/providers/fireworks-ai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-web/src/pages/settings/providers/mistral-ai.vue b/apps/stage-web/src/pages/settings/providers/mistral-ai.vue new file mode 100644 index 000000000..d8ce05811 --- /dev/null +++ b/apps/stage-web/src/pages/settings/providers/mistral-ai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-web/src/pages/settings/providers/moonshot-ai.vue b/apps/stage-web/src/pages/settings/providers/moonshot-ai.vue new file mode 100644 index 000000000..0b4cf3fe8 --- /dev/null +++ b/apps/stage-web/src/pages/settings/providers/moonshot-ai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-web/src/pages/settings/providers/novita-ai.vue b/apps/stage-web/src/pages/settings/providers/novita-ai.vue new file mode 100644 index 000000000..3a30194da --- /dev/null +++ b/apps/stage-web/src/pages/settings/providers/novita-ai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-web/src/pages/settings/providers/openai.vue b/apps/stage-web/src/pages/settings/providers/openai.vue index a57f8261e..be6528d6f 100644 --- a/apps/stage-web/src/pages/settings/providers/openai.vue +++ b/apps/stage-web/src/pages/settings/providers/openai.vue @@ -1,11 +1,17 @@ - - - - - - - Provider - - - {{ providerMetadata?.localizedName || 'OpenAI' }} - - - - - - - - - - Basic - - - Essential settings - - - - - - - - - - - API Key - * - - - API Key for {{ providerMetadata?.localizedName || 'OpenAI' }} - - - - - - - - - - - slotProps.setVisible(!slotProps.visible) && toggleAdvancedVisible()" - > - - Advanced - - - - - - - - - - - Base URL - - - Custom base URL (optional) - - - - - - - - - - - + + + + + + + + + + diff --git a/apps/stage-web/src/pages/settings/providers/openrouter-ai.vue b/apps/stage-web/src/pages/settings/providers/openrouter-ai.vue index 7fe35b984..260539bca 100644 --- a/apps/stage-web/src/pages/settings/providers/openrouter-ai.vue +++ b/apps/stage-web/src/pages/settings/providers/openrouter-ai.vue @@ -1,11 +1,17 @@ - - - - - - - Provider - - - {{ providerMetadata?.localizedName }} - - - - - - - - - - Basic - - - Essential settings - - - - - - - - - - - API Key - * - - - API Key for {{ providerMetadata?.localizedName }} - - - - - - - - - - - slotProps.setVisible(!slotProps.visible) && toggleAdvancedVisible()" - > - - Advanced - - - - - - - - - - - Base URL - - - Custom base URL (optional) - - - - - - - - - - - + + + + + + + + + + diff --git a/apps/stage-web/src/pages/settings/providers/together-ai.vue b/apps/stage-web/src/pages/settings/providers/together-ai.vue new file mode 100644 index 000000000..85b14fbd6 --- /dev/null +++ b/apps/stage-web/src/pages/settings/providers/together-ai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/apps/stage-web/src/pages/settings/providers/xai.vue b/apps/stage-web/src/pages/settings/providers/xai.vue new file mode 100644 index 000000000..a194366b0 --- /dev/null +++ b/apps/stage-web/src/pages/settings/providers/xai.vue @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + diff --git a/packages/stage-ui/histoire.config.ts b/packages/stage-ui/histoire.config.ts index fd1e5dc25..a34ec2660 100644 --- a/packages/stage-ui/histoire.config.ts +++ b/packages/stage-ui/histoire.config.ts @@ -2,6 +2,7 @@ import { HstVue } from '@histoire/plugin-vue' import { defineConfig } from 'histoire' export default defineConfig({ + routerMode: 'hash', plugins: [ HstVue(), ], diff --git a/packages/stage-ui/src/components/index.ts b/packages/stage-ui/src/components/index.ts index d46fc4da4..ab6ad748d 100644 --- a/packages/stage-ui/src/components/index.ts +++ b/packages/stage-ui/src/components/index.ts @@ -4,6 +4,7 @@ export * from './Form' export { default as Live2DCanvas } from './Live2D/Canvas.vue' export { default as Live2DModel } from './Live2D/Model.vue' export * from './Menu' +export * from './providers' export { default as SceneLive2D } from './Scenes/Live2D.vue' export { default as SceneVRM } from './Scenes/VRM.vue' export { default as TransitionVertical } from './TransitionVertical.vue' diff --git a/packages/stage-ui/src/components/providers/ProviderAccountIdInput.vue b/packages/stage-ui/src/components/providers/ProviderAccountIdInput.vue new file mode 100644 index 000000000..1e4f89e4c --- /dev/null +++ b/packages/stage-ui/src/components/providers/ProviderAccountIdInput.vue @@ -0,0 +1,45 @@ + + + + + + + + {{ label || 'Account ID' }} + * + + + {{ description || 'Account ID' }} + + + + + + diff --git a/packages/stage-ui/src/components/providers/ProviderAdvancedSettings.vue b/packages/stage-ui/src/components/providers/ProviderAdvancedSettings.vue new file mode 100644 index 000000000..04d72aad6 --- /dev/null +++ b/packages/stage-ui/src/components/providers/ProviderAdvancedSettings.vue @@ -0,0 +1,38 @@ + + + + + + slotProps.setVisible(!slotProps.visible) && toggleVisible()" + > + + {{ title || 'Advanced' }} + + + + + + + + + + + diff --git a/packages/stage-ui/src/components/providers/ProviderApiKeyInput.vue b/packages/stage-ui/src/components/providers/ProviderApiKeyInput.vue new file mode 100644 index 000000000..b30fe6020 --- /dev/null +++ b/packages/stage-ui/src/components/providers/ProviderApiKeyInput.vue @@ -0,0 +1,46 @@ + + + + + + + + {{ label || 'API Key' }} + * + + + {{ description || `API Key for ${providerName}` }} + + + + + + diff --git a/packages/stage-ui/src/components/providers/ProviderBaseUrlInput.vue b/packages/stage-ui/src/components/providers/ProviderBaseUrlInput.vue new file mode 100644 index 000000000..aa8b3638e --- /dev/null +++ b/packages/stage-ui/src/components/providers/ProviderBaseUrlInput.vue @@ -0,0 +1,43 @@ + + + + + + + {{ label || 'Base URL' }} + * + + + {{ description || 'Custom base URL (optional)' }} + + + + + diff --git a/packages/stage-ui/src/components/providers/ProviderBasicSettings.vue b/packages/stage-ui/src/components/providers/ProviderBasicSettings.vue new file mode 100644 index 000000000..400d6cd6f --- /dev/null +++ b/packages/stage-ui/src/components/providers/ProviderBasicSettings.vue @@ -0,0 +1,34 @@ + + + + + + + + {{ title || 'Basic' }} + + + {{ description || 'Essential settings' }} + + + + + + + + + diff --git a/packages/stage-ui/src/components/providers/ProviderCheckboxInput.vue b/packages/stage-ui/src/components/providers/ProviderCheckboxInput.vue new file mode 100644 index 000000000..bca9dc663 --- /dev/null +++ b/packages/stage-ui/src/components/providers/ProviderCheckboxInput.vue @@ -0,0 +1,37 @@ + + + + + + + + {{ label }} + + + {{ description }} + + + {{ value ? 'On' : 'Off' }} + + + + + + diff --git a/packages/stage-ui/src/components/providers/ProviderSettingsContainer.vue b/packages/stage-ui/src/components/providers/ProviderSettingsContainer.vue new file mode 100644 index 000000000..9e3b77a6b --- /dev/null +++ b/packages/stage-ui/src/components/providers/ProviderSettingsContainer.vue @@ -0,0 +1,9 @@ + + + + + + + diff --git a/packages/stage-ui/src/components/providers/ProviderSettingsLayout.vue b/packages/stage-ui/src/components/providers/ProviderSettingsLayout.vue new file mode 100644 index 000000000..a75be2b89 --- /dev/null +++ b/packages/stage-ui/src/components/providers/ProviderSettingsLayout.vue @@ -0,0 +1,35 @@ + + + + + + + + + + Provider + + + {{ providerName }} + + + + + + + + diff --git a/packages/stage-ui/src/components/providers/ProviderSliderInput.vue b/packages/stage-ui/src/components/providers/ProviderSliderInput.vue new file mode 100644 index 000000000..9e555f8c9 --- /dev/null +++ b/packages/stage-ui/src/components/providers/ProviderSliderInput.vue @@ -0,0 +1,55 @@ + + + + + + + + {{ label }} + + + {{ description }} + + + {{ formattedValue }} + + + + + + diff --git a/packages/stage-ui/src/components/providers/index.ts b/packages/stage-ui/src/components/providers/index.ts new file mode 100644 index 000000000..acdeb03a0 --- /dev/null +++ b/packages/stage-ui/src/components/providers/index.ts @@ -0,0 +1,9 @@ +export { default as ProviderAccountIdInput } from './ProviderAccountIdInput.vue' +export { default as ProviderAdvancedSettings } from './ProviderAdvancedSettings.vue' +export { default as ProviderApiKeyInput } from './ProviderApiKeyInput.vue' +export { default as ProviderBaseUrlInput } from './ProviderBaseUrlInput.vue' +export { default as ProviderBasicSettings } from './ProviderBasicSettings.vue' +export { default as ProviderCheckboxInput } from './ProviderCheckboxInput.vue' +export { default as ProviderSettingsContainer } from './ProviderSettingsContainer.vue' +export { default as ProviderSettingsLayout } from './ProviderSettingsLayout.vue' +export { default as ProviderSliderInput } from './ProviderSliderInput.vue'