diff --git a/apps/stage-tamagotchi/src/pages/settings/airi-card/components/CardCreate.vue b/apps/stage-tamagotchi/src/pages/settings/airi-card/components/CardCreate.vue new file mode 100644 index 000000000..f2aaec808 --- /dev/null +++ b/apps/stage-tamagotchi/src/pages/settings/airi-card/components/CardCreate.vue @@ -0,0 +1,22 @@ + + + + + + + + {{ t('settings.pages.card.create_card') }} + + + diff --git a/apps/stage-tamagotchi/src/pages/settings/airi-card/components/CardCreationDialog.vue b/apps/stage-tamagotchi/src/pages/settings/airi-card/components/CardCreationDialog.vue new file mode 100644 index 000000000..755c33a07 --- /dev/null +++ b/apps/stage-tamagotchi/src/pages/settings/airi-card/components/CardCreationDialog.vue @@ -0,0 +1,280 @@ + + + + + + + + + + {{ t("settings.pages.card.create_card") }} + + + + + + + + + + {{ tab.label }} + + + + + + + + + + {{ errorMessage }} + + + + + + + + {{ t('settings.pages.card.creation.fields_info.subtitle') }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/stage-tamagotchi/src/pages/settings/airi-card/index.vue b/apps/stage-tamagotchi/src/pages/settings/airi-card/index.vue index 409e17c52..12becb52f 100644 --- a/apps/stage-tamagotchi/src/pages/settings/airi-card/index.vue +++ b/apps/stage-tamagotchi/src/pages/settings/airi-card/index.vue @@ -8,6 +8,8 @@ import { storeToRefs } from 'pinia' import { computed, ref, watch } from 'vue' import { useI18n } from 'vue-i18n' +import CardCreate from './components/CardCreate.vue' +import CardCreationDialog from './components/CardCreationDialog.vue' import CardDetailDialog from './components/CardDetailDialog.vue' import CardListItem from './components/CardListItem.vue' import DeleteCardDialog from './components/DeleteCardDialog.vue' @@ -21,6 +23,7 @@ const { cards, activeCardId } = storeToRefs(cardStore) const selectedCardId = ref('') // Dialog state const isCardDialogOpen = ref(false) +const isCardCreationDialogOpen = ref(false) // Search query const searchQuery = ref('') @@ -116,6 +119,10 @@ function handleSelectCard(cardId: string) { isCardDialogOpen.value = true } +function handleCardCreationDialog() { + isCardCreationDialogOpen.value = true +} + // Card activation function activateCard(id: string) { activeCardId.value = id @@ -147,7 +154,7 @@ function getModuleShortName(id: string, module: 'consciousness' | 'voice') { - + @@ -214,6 +221,9 @@ function getModuleShortName(id: string, module: 'consciousness' | 'voice') { + + + + + + { :description="t('settings.pages.providers.common.section.advanced.fields.field.headers.description')" :key-placeholder="t('settings.pages.providers.common.section.advanced.fields.field.headers.key.placeholder')" :value-placeholder="t('settings.pages.providers.common.section.advanced.fields.field.headers.value.placeholder')" - @add="(key, value) => addKeyValue(headers, key, value)" - @remove="(index) => removeKeyValue(index, headers)" + @add="(key: string, value: string) => addKeyValue(headers, key, value)" + @remove="(index: number) => removeKeyValue(index, headers)" /> diff --git a/apps/stage-tamagotchi/src/pages/settings/providers/player2-api.vue b/apps/stage-tamagotchi/src/pages/settings/providers/player2-api.vue new file mode 100644 index 000000000..c0db6537a --- /dev/null +++ b/apps/stage-tamagotchi/src/pages/settings/providers/player2-api.vue @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + meta: + layout: settings + stageTransition: + name: slide + diff --git a/apps/stage-web/src/pages/settings/modules/consciousness.vue b/apps/stage-web/src/pages/settings/modules/consciousness.vue index f59919d72..9440dd772 100644 --- a/apps/stage-web/src/pages/settings/modules/consciousness.vue +++ b/apps/stage-web/src/pages/settings/modules/consciousness.vue @@ -8,7 +8,7 @@ import { RouterLink } from 'vue-router' const providersStore = useProvidersStore() const consciousnessStore = useConsciousnessStore() -const { availableProviders, allChatProvidersMetadata } = storeToRefs(providersStore) +const { configuredChatProvidersMetadata } = storeToRefs(providersStore) const { activeProvider, activeModel, @@ -50,14 +50,14 @@ function updateCustomModelName(value: string) { See also: https://stackoverflow.com/a/33737340 --> +import IconAnimation from '../../../components/IconAnimation.vue' import { useIconAnimation } from '../../../composables/useIconAnimation' const { diff --git a/packages/stage-ui/src/stores/providers.ts b/packages/stage-ui/src/stores/providers.ts index 5a27f27cf..6ae09f1eb 100644 --- a/packages/stage-ui/src/stores/providers.ts +++ b/packages/stage-ui/src/stores/providers.ts @@ -66,6 +66,7 @@ export interface ProviderMetadata { validators: { validateProviderConfig: (config: Record) => Promise | boolean } + configured?: boolean } export interface ModelInfo { @@ -183,7 +184,13 @@ export const useProvidersStore = defineStore('providers', () => { }, validators: { validateProviderConfig: (config) => { - return !!config.baseUrl + if (!config.baseUrl) + return false + + // Check if the Ollama server is reachable + return fetch(`${(config.baseUrl as string).trim()}models`) + .then(response => response.ok) + .catch(() => false) }, }, }, @@ -916,9 +923,13 @@ export const useProvidersStore = defineStore('providers', () => { }, validators: { validateProviderConfig: (config) => { - const url: string = config.baseUrl ? config.baseUrl as string : 'http://localhost:4315/v1/' - // checks if health status is there, so it green if and only if you actually have the player2 app running - return (fetch(`${url}health`).then(r => r.status === 200).catch(() => false)) + if (!config.baseUrl) + return false + + // Check if the Player2 API server is reachable + return fetch(`${(config.baseUrl as string).trim()}health`) + .then(response => response.ok) + .catch(() => false) }, }, }, @@ -1241,6 +1252,18 @@ export const useProvidersStore = defineStore('providers', () => { return allProvidersMetadata.value.filter(metadata => metadata.category === 'transcription') }) + const configuredChatProvidersMetadata = computed(() => { + return allChatProvidersMetadata.value.filter(metadata => configuredProviders.value[metadata.id]) + }) + + const configuredSpeechProvidersMetadata = computed(() => { + return allAudioSpeechProvidersMetadata.value.filter(metadata => configuredProviders.value[metadata.id]) + }) + + const configuredTranscriptionProvidersMetadata = computed(() => { + return allAudioTranscriptionProvidersMetadata.value.filter(metadata => configuredProviders.value[metadata.id]) + }) + function getProviderConfig(providerId: string) { return providerCredentials.value[providerId] } @@ -1267,5 +1290,8 @@ export const useProvidersStore = defineStore('providers', () => { allChatProvidersMetadata, allAudioSpeechProvidersMetadata, allAudioTranscriptionProvidersMetadata, + configuredChatProvidersMetadata, + configuredSpeechProvidersMetadata, + configuredTranscriptionProvidersMetadata, } })
+ {{ t('settings.pages.card.create_card') }} +
+ {{ errorMessage }} +
+ {{ t('settings.pages.card.creation.fields_info.subtitle') }} +