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 360a65bd3..0446459a3 100644
--- a/packages/stage-pages/src/pages/settings/providers/chat/[providerId].vue
+++ b/packages/stage-pages/src/pages/settings/providers/chat/[providerId].vue
@@ -11,6 +11,7 @@ import {
ProviderValidationAlerts,
} from '@proj-airi/stage-ui/components'
import { useProviderValidation } from '@proj-airi/stage-ui/composables/use-provider-validation'
+import { getDefinedProvider } from '@proj-airi/stage-ui/libs'
import { useConsciousnessStore } from '@proj-airi/stage-ui/stores/modules/consciousness'
import { useProvidersStore } from '@proj-airi/stage-ui/stores/providers'
import { storeToRefs } from 'pinia'
@@ -60,6 +61,21 @@ const {
runManualTest,
} = useProviderValidation(providerId)
+const apiKeyPlaceholder = computed(() => {
+ const definition = getDefinedProvider(providerId)
+ if (!definition?.createProviderConfig)
+ return 'sk-...'
+
+ const schema = definition.createProviderConfig({ t }) as any
+ const shape = typeof schema?.shape === 'function' ? schema.shape() : schema?.shape
+ const apiKeySchema = shape?.apiKey
+ if (!apiKeySchema)
+ return 'sk-...'
+
+ const meta = typeof apiKeySchema.meta === 'function' ? apiKeySchema.meta() : undefined
+ return typeof meta?.placeholderLocalized === 'string' ? meta.placeholderLocalized : 'sk-...'
+})
+
function goToModelSelection() {
activeProvider.value = providerId
router.push('/settings/modules/consciousness')
@@ -81,7 +97,7 @@ function goToModelSelection() {
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 7fc9e2733..07979c648 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
@@ -7,6 +7,7 @@ import {
SpeechProviderSettings,
} from '@proj-airi/stage-ui/components'
import { useProviderValidation } from '@proj-airi/stage-ui/composables/use-provider-validation'
+import { getDefinedProvider } from '@proj-airi/stage-ui/libs'
import { useSpeechStore } from '@proj-airi/stage-ui/stores/modules/speech'
import { useProvidersStore } from '@proj-airi/stage-ui/stores/providers'
import { FieldInput, FieldRange } from '@proj-airi/ui'
@@ -155,6 +156,21 @@ const {
validationMessage,
forceValid,
} = useProviderValidation(providerId)
+
+const apiKeyPlaceholder = computed(() => {
+ const definition = getDefinedProvider(providerId)
+ if (!definition?.createProviderConfig)
+ return 'sk-...'
+
+ const schema = definition.createProviderConfig({ t }) as any
+ const shape = typeof schema?.shape === 'function' ? schema.shape() : schema?.shape
+ const apiKeySchema = shape?.apiKey
+ if (!apiKeySchema)
+ return 'sk-...'
+
+ const meta = typeof apiKeySchema.meta === 'function' ? apiKeySchema.meta() : undefined
+ return typeof meta?.placeholderLocalized === 'string' ? meta.placeholderLocalized : 'sk-...'
+})
@@ -162,7 +178,7 @@ const {
:provider-id="providerId"
:default-model="defaultModel"
:additional-settings="defaultVoiceSettings"
- placeholder="sk-..."
+ :placeholder="apiKeyPlaceholder"
>
diff --git a/packages/stage-pages/src/pages/settings/providers/transcription/comet-api-transcription.vue b/packages/stage-pages/src/pages/settings/providers/transcription/comet-api-transcription.vue
index 4ca22d00a..ae8dfce97 100644
--- a/packages/stage-pages/src/pages/settings/providers/transcription/comet-api-transcription.vue
+++ b/packages/stage-pages/src/pages/settings/providers/transcription/comet-api-transcription.vue
@@ -13,6 +13,7 @@ import {
TranscriptionPlayground,
} from '@proj-airi/stage-ui/components'
import { useProviderValidation } from '@proj-airi/stage-ui/composables/use-provider-validation'
+import { getDefinedProvider } from '@proj-airi/stage-ui/libs'
import { useHearingStore } from '@proj-airi/stage-ui/stores/modules/hearing'
import { useProvidersStore } from '@proj-airi/stage-ui/stores/providers'
import { FieldInput } from '@proj-airi/ui'
@@ -81,6 +82,21 @@ const {
handleResetSettings,
forceValid,
} = useProviderValidation(providerId)
+
+const apiKeyPlaceholder = computed(() => {
+ const definition = getDefinedProvider(providerId)
+ if (!definition?.createProviderConfig)
+ return 'sk-...'
+
+ const schema = definition.createProviderConfig({ t }) as any
+ const shape = typeof schema?.shape === 'function' ? schema.shape() : schema?.shape
+ const apiKeySchema = shape?.apiKey
+ if (!apiKeySchema)
+ return 'sk-...'
+
+ const meta = typeof apiKeySchema.meta === 'function' ? apiKeySchema.meta() : undefined
+ return typeof meta?.placeholderLocalized === 'string' ? meta.placeholderLocalized : 'sk-...'
+})
@@ -98,7 +114,7 @@ const {
{
+ const definition = getDefinedProvider(providerId)
+ if (!definition?.createProviderConfig)
+ return 'sk-...'
+
+ const schema = definition.createProviderConfig({ t }) as any
+ const shape = typeof schema?.shape === 'function' ? schema.shape() : schema?.shape
+ const apiKeySchema = shape?.apiKey
+ if (!apiKeySchema)
+ return 'sk-...'
+
+ const meta = typeof apiKeySchema.meta === 'function' ? apiKeySchema.meta() : undefined
+ return typeof meta?.placeholderLocalized === 'string' ? meta.placeholderLocalized : 'sk-...'
+})
+
// Expand Advanced section if there's a base URL validation error
const shouldExpandAdvanced = computed(() => {
if (!validationMessage.value)
@@ -195,7 +211,7 @@ watch(model, () => {