diff --git a/packages/i18n/src/locales/en/settings.yaml b/packages/i18n/src/locales/en/settings.yaml index a35360c5b..e3883e14a 100644 --- a/packages/i18n/src/locales/en/settings.yaml +++ b/packages/i18n/src/locales/en/settings.yaml @@ -939,6 +939,9 @@ pages: proceed. action: Save anyway config: + loading: Loading provider settings... + load-error: Failed to load provider settings. + retry: Retry common: fields: field: diff --git a/packages/i18n/src/locales/zh-Hans/settings.yaml b/packages/i18n/src/locales/zh-Hans/settings.yaml index 3e800c586..ab2353603 100644 --- a/packages/i18n/src/locales/zh-Hans/settings.yaml +++ b/packages/i18n/src/locales/zh-Hans/settings.yaml @@ -901,6 +901,9 @@ pages: 如果你想要继续,你仍然可以保存当前的配置。 action: 仍要保存 config: + loading: 正在加载服务来源设置…… + load-error: 无法加载服务来源设置。 + retry: 重试 common: fields: field: diff --git a/packages/stage-layouts/src/composables/use-transcriptions.ts b/packages/stage-layouts/src/composables/use-transcriptions.ts index 9b08839f0..c3d4899f8 100644 --- a/packages/stage-layouts/src/composables/use-transcriptions.ts +++ b/packages/stage-layouts/src/composables/use-transcriptions.ts @@ -112,7 +112,7 @@ export function useTranscriptions(options: TranscriptionOptions) { // Initialize the provider in the providers store first try { - providersStore.initializeProvider('browser-web-speech-api') + await providersStore.initializeProvider('browser-web-speech-api') hearingStore.activeTranscriptionProvider = 'browser-web-speech-api' } catch (err) { diff --git a/packages/stage-pages/src/pages/settings/providers/chat/[providerId].vue b/packages/stage-pages/src/pages/settings/providers/chat/[providerId].vue index 705f6d20c..b1f43b672 100644 --- a/packages/stage-pages/src/pages/settings/providers/chat/[providerId].vue +++ b/packages/stage-pages/src/pages/settings/providers/chat/[providerId].vue @@ -16,6 +16,7 @@ import { useConsciousnessStore } from '@proj-airi/stage-ui/stores/modules/consci import { useProviderConfigStore } from '@proj-airi/stage-ui/stores/providers/config' import { useProviderStore } from '@proj-airi/stage-ui/stores/providers/provider' import { FieldCombobox } from '@proj-airi/ui' +import { computedAsync } from '@vueuse/core' import { storeToRefs } from 'pinia' import { computed } from 'vue' import { useRoute } from 'vue-router' @@ -76,12 +77,12 @@ const { runManualTest, } = useProviderValidation(providerId) -const apiKeyPlaceholder = computed(() => { +const apiKeyPlaceholder = computedAsync(async () => { const definition = providerDefinition.value ?? getDefinedProvider(providerId) if (!definition?.createProviderConfig) return 'sk-...' - const schema = definition.createProviderConfig({ t }) as any + const schema = await definition.createProviderConfig({ t }) as any const shape = typeof schema?.shape === 'function' ? schema.shape() : schema?.shape const apiKeySchema = shape?.apiKey if (!apiKeySchema) @@ -89,7 +90,7 @@ const apiKeyPlaceholder = computed(() => { const meta = typeof apiKeySchema.meta === 'function' ? apiKeySchema.meta() : undefined return typeof meta?.placeholderLocalized === 'string' ? meta.placeholderLocalized : 'sk-...' -}) +}, 'sk-...') function goToModelSelection() { activeProvider.value = providerId diff --git a/packages/stage-pages/src/pages/settings/providers/chat/official-provider.vue b/packages/stage-pages/src/pages/settings/providers/chat/official-provider.vue index a6715c252..6da439404 100644 --- a/packages/stage-pages/src/pages/settings/providers/chat/official-provider.vue +++ b/packages/stage-pages/src/pages/settings/providers/chat/official-provider.vue @@ -8,6 +8,7 @@ import { selectProviderMetadata } from '@proj-airi/stage-ui/libs' import { useAuthStore } from '@proj-airi/stage-ui/stores/auth' import { useProviderStore } from '@proj-airi/stage-ui/stores/providers/provider' import { Callout } from '@proj-airi/ui' +import { computedAsync } from '@vueuse/core' import { storeToRefs } from 'pinia' import { useI18n } from 'vue-i18n' import { useRouter } from 'vue-router' @@ -19,7 +20,7 @@ const providersStore = useProviderStore() const { isAuthenticated, credits, needsLogin } = storeToRefs(authStore) const providerId = 'official-provider' -const providerMetadata = selectProviderMetadata(providersStore.getProviderDefinition(providerId), t, { id: providerId }) +const providerMetadata = computedAsync(() => selectProviderMetadata(providersStore.getProviderDefinition(providerId), t, { id: providerId })) const fluxPurchaseDisabled = isFluxPurchaseDisabled() function handleLogin() { diff --git a/packages/stage-pages/src/pages/settings/providers/chat/ollama.vue b/packages/stage-pages/src/pages/settings/providers/chat/ollama.vue index efa580406..91863313e 100644 --- a/packages/stage-pages/src/pages/settings/providers/chat/ollama.vue +++ b/packages/stage-pages/src/pages/settings/providers/chat/ollama.vue @@ -119,8 +119,8 @@ async function refetch() { } watch([baseUrl, thinkingMode, headers], refetch, { immediate: true, deep: true }) -onMounted(() => { - providersStore.initializeProvider(providerId) +onMounted(async () => { + await providersStore.initializeProvider(providerId) // Initialize refs with current values baseUrl.value = providers.value[providerId]?.baseUrl || providerMetadata.value?.defaultConfig.baseUrl || '' diff --git a/packages/stage-pages/src/pages/settings/providers/speech/official-provider-speech-streaming.vue b/packages/stage-pages/src/pages/settings/providers/speech/official-provider-speech-streaming.vue index c5fef532d..46139288a 100644 --- a/packages/stage-pages/src/pages/settings/providers/speech/official-provider-speech-streaming.vue +++ b/packages/stage-pages/src/pages/settings/providers/speech/official-provider-speech-streaming.vue @@ -11,6 +11,7 @@ import { useSpeechStore } from '@proj-airi/stage-ui/stores/modules/speech' import { useProviderConfigStore } from '@proj-airi/stage-ui/stores/providers/config' import { useProviderStore } from '@proj-airi/stage-ui/stores/providers/provider' import { Callout, ComboboxSelect } from '@proj-airi/ui' +import { computedAsync } from '@vueuse/core' import { storeToRefs } from 'pinia' import { computed, onMounted, ref, watch } from 'vue' import { useI18n } from 'vue-i18n' @@ -25,7 +26,7 @@ const speechStore = useSpeechStore() const { isAuthenticated, credits, needsLogin } = storeToRefs(authStore) const providerId = 'official-provider-speech-streaming' -const providerMetadata = computed(() => selectProviderMetadata( +const providerMetadata = computedAsync(() => selectProviderMetadata( providersStore.getProviderDefinition(providerId), t, { id: providerId }, diff --git a/packages/stage-pages/src/pages/settings/providers/speech/official-provider-speech.vue b/packages/stage-pages/src/pages/settings/providers/speech/official-provider-speech.vue index b01633d2d..271d70e67 100644 --- a/packages/stage-pages/src/pages/settings/providers/speech/official-provider-speech.vue +++ b/packages/stage-pages/src/pages/settings/providers/speech/official-provider-speech.vue @@ -8,6 +8,7 @@ import { selectProviderMetadata } from '@proj-airi/stage-ui/libs' import { useAuthStore } from '@proj-airi/stage-ui/stores/auth' import { useProviderStore } from '@proj-airi/stage-ui/stores/providers/provider' import { Callout } from '@proj-airi/ui' +import { computedAsync } from '@vueuse/core' import { storeToRefs } from 'pinia' import { useI18n } from 'vue-i18n' import { useRouter } from 'vue-router' @@ -19,7 +20,7 @@ const providersStore = useProviderStore() const { isAuthenticated, credits, needsLogin } = storeToRefs(authStore) const providerId = 'official-provider-speech' -const providerMetadata = selectProviderMetadata(providersStore.getProviderDefinition(providerId), t, { id: providerId }) +const providerMetadata = computedAsync(() => selectProviderMetadata(providersStore.getProviderDefinition(providerId), t, { id: providerId })) const fluxPurchaseDisabled = isFluxPurchaseDisabled() function handleLogin() { diff --git a/packages/stage-pages/src/pages/settings/providers/speech/openai-compatible-audio-speech.vue b/packages/stage-pages/src/pages/settings/providers/speech/openai-compatible-audio-speech.vue index 37d6ec294..4dec88d1e 100644 --- a/packages/stage-pages/src/pages/settings/providers/speech/openai-compatible-audio-speech.vue +++ b/packages/stage-pages/src/pages/settings/providers/speech/openai-compatible-audio-speech.vue @@ -12,6 +12,7 @@ import { useSpeechStore } from '@proj-airi/stage-ui/stores/modules/speech' import { useProviderConfigStore } from '@proj-airi/stage-ui/stores/providers/config' import { useProviderStore } from '@proj-airi/stage-ui/stores/providers/provider' import { FieldInput, FieldRange } from '@proj-airi/ui' +import { computedAsync } from '@vueuse/core' import { storeToRefs } from 'pinia' import { computed, onMounted, ref, watch } from 'vue' import { useI18n } from 'vue-i18n' @@ -144,12 +145,12 @@ const { forceValid, } = useProviderValidation(providerId) -const apiKeyPlaceholder = computed(() => { +const apiKeyPlaceholder = computedAsync(async () => { const definition = getDefinedProvider(providerId) if (!definition?.createProviderConfig) return 'sk-...' - const schema = definition.createProviderConfig({ t }) as any + const schema = await definition.createProviderConfig({ t }) as any const shape = typeof schema?.shape === 'function' ? schema.shape() : schema?.shape const apiKeySchema = shape?.apiKey if (!apiKeySchema) @@ -157,7 +158,7 @@ const apiKeyPlaceholder = computed(() => { const meta = typeof apiKeySchema.meta === 'function' ? apiKeySchema.meta() : undefined return typeof meta?.placeholderLocalized === 'string' ? meta.placeholderLocalized : 'sk-...' -}) +}, 'sk-...')