diff --git a/apps/stage-tamagotchi-tauri/src/pages/settings/providers/google-generative-ai.vue b/apps/stage-tamagotchi-tauri/src/pages/settings/providers/google-generative-ai.vue new file mode 100644 index 000000000..1066cb7b1 --- /dev/null +++ b/apps/stage-tamagotchi-tauri/src/pages/settings/providers/google-generative-ai.vue @@ -0,0 +1,104 @@ + + + diff --git a/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/google-generative-ai.vue b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/google-generative-ai.vue new file mode 100644 index 000000000..1066cb7b1 --- /dev/null +++ b/apps/stage-tamagotchi/src/renderer/src/pages/settings/providers/google-generative-ai.vue @@ -0,0 +1,104 @@ + + + diff --git a/apps/stage-web/src/pages/settings/providers/google-generative-ai.vue b/apps/stage-web/src/pages/settings/providers/google-generative-ai.vue new file mode 100644 index 000000000..1066cb7b1 --- /dev/null +++ b/apps/stage-web/src/pages/settings/providers/google-generative-ai.vue @@ -0,0 +1,104 @@ + + + diff --git a/packages/stage-ui/src/stores/providers.ts b/packages/stage-ui/src/stores/providers.ts index dcbac624d..338d4c3f2 100644 --- a/packages/stage-ui/src/stores/providers.ts +++ b/packages/stage-ui/src/stores/providers.ts @@ -17,6 +17,7 @@ import { createAnthropic, createDeepSeek, createFireworks, + createGoogleGenerativeAI, createMistral, createMoonshot, createNovita, @@ -319,6 +320,84 @@ export const useProvidersStore = defineStore('providers', () => { }, }, }, + 'google-generative-ai': { + id: 'google-generative-ai', + nameKey: 'settings.pages.providers.provider.google-generative-ai.title', + name: 'Google Gemini', + descriptionKey: 'settings.pages.providers.provider.google-generative-ai.description', + description: 'ai.google.dev', + icon: 'i-lobe-icons:gemini', + defaultOptions: { + baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai/', + }, + createProvider: config => createGoogleGenerativeAI((config.apiKey as string).trim(), (config.baseUrl as string).trim()), + capabilities: { + listModels: async (config) => { + return (await listModels({ + ...createGoogleGenerativeAI((config.apiKey as string).trim(), (config.baseUrl as string).trim()).model(), + })).map((model) => { + return { + id: model.id, + name: model.id, + provider: 'google-generative-ai', + description: '', + contextLength: 0, + deprecated: false, + } satisfies ModelInfo + }) + }, + }, + }, + 'xai': { + id: 'xai', + nameKey: 'settings.pages.providers.provider.xai.title', + name: 'xAI', + descriptionKey: 'settings.pages.providers.provider.xai.description', + description: 'x.ai', + icon: 'i-lobe-icons:xai', + createProvider: config => createXAI((config.apiKey as string).trim(), (config.baseUrl as string).trim()), + capabilities: { + listModels: async (config) => { + return (await listModels({ + ...createXAI((config.apiKey as string).trim(), (config.baseUrl as string).trim()).model(), + })).map((model) => { + return { + id: model.id, + name: model.id, + provider: 'xai', + description: '', + contextLength: 0, + deprecated: false, + } satisfies ModelInfo + }) + }, + }, + }, + 'deepseek': { + id: 'deepseek', + nameKey: 'settings.pages.providers.provider.deepseek.title', + name: 'DeepSeek', + descriptionKey: 'settings.pages.providers.provider.deepseek.description', + description: 'deepseek.com', + iconColor: 'i-lobe-icons:deepseek-color', + createProvider: config => createDeepSeek((config.apiKey as string).trim(), (config.baseUrl as string).trim()), + capabilities: { + listModels: async (config) => { + return (await listModels({ + ...createDeepSeek((config.apiKey as string).trim(), (config.baseUrl as string).trim()).model(), + })).map((model) => { + return { + id: model.id, + name: model.id, + provider: 'deepseek', + description: '', + contextLength: 0, + deprecated: false, + } satisfies ModelInfo + }) + }, + }, + }, 'elevenlabs': { id: 'elevenlabs', nameKey: 'settings.pages.providers.provider.elevenlabs.title', @@ -383,52 +462,46 @@ export const useProvidersStore = defineStore('providers', () => { }, }, }, - 'xai': { - id: 'xai', - nameKey: 'settings.pages.providers.provider.xai.title', - name: 'xAI', - descriptionKey: 'settings.pages.providers.provider.xai.description', - description: 'x.ai', - icon: 'i-lobe-icons:xai', - createProvider: config => createXAI((config.apiKey as string).trim(), (config.baseUrl as string).trim()), - capabilities: { - listModels: async (config) => { - return (await listModels({ - ...createXAI((config.apiKey as string).trim(), (config.baseUrl as string).trim()).model(), - })).map((model) => { - return { - id: model.id, - name: model.id, - provider: 'xai', - description: '', - contextLength: 0, - deprecated: false, - } satisfies ModelInfo - }) - }, + 'microsoft-speech': { + id: 'microsoft-speech', + nameKey: 'settings.pages.providers.provider.microsoft-speech.title', + name: 'Microsoft / Azure Speech', + descriptionKey: 'settings.pages.providers.provider.microsoft-speech.description', + description: 'speech.microsoft.com', + iconColor: 'i-lobe-icons:microsoft-color', + defaultOptions: { + baseUrl: 'https://unspeech.hyp3r.link/v1/', }, - }, - 'deepseek': { - id: 'deepseek', - nameKey: 'settings.pages.providers.provider.deepseek.title', - name: 'DeepSeek', - descriptionKey: 'settings.pages.providers.provider.deepseek.description', - description: 'deepseek.com', - iconColor: 'i-lobe-icons:deepseek-color', - createProvider: config => createDeepSeek((config.apiKey as string).trim(), (config.baseUrl as string).trim()), + createProvider: config => createUnMicrosoft((config.apiKey as string).trim(), (config.baseUrl as string).trim()) as SpeechProviderWithExtraOptions, capabilities: { - listModels: async (config) => { - return (await listModels({ - ...createDeepSeek((config.apiKey as string).trim(), (config.baseUrl as string).trim()).model(), - })).map((model) => { - return { - id: model.id, - name: model.id, - provider: 'deepseek', + listModels: async () => { + return [ + { + id: 'v1', + name: 'v1', + provider: 'microsoft-speech', description: '', contextLength: 0, deprecated: false, - } satisfies ModelInfo + }, + ] + }, + listVoices: async (config) => { + const provider = createUnMicrosoft((config.apiKey as string).trim(), (config.baseUrl as string).trim()) as VoiceProviderWithExtraOptions + + const voices = await listVoices({ + ...provider.voice({ region: config.region as string }), + }) + + return voices.map((voice) => { + return { + id: voice.id, + name: voice.name, + provider: 'microsoft-speech', + previewURL: voice.preview_audio_url, + languages: voice.languages, + gender: voice.labels?.gender, + } }) }, }, @@ -508,50 +581,6 @@ export const useProvidersStore = defineStore('providers', () => { }, }, }, - 'microsoft-speech': { - id: 'microsoft-speech', - nameKey: 'settings.pages.providers.provider.microsoft-speech.title', - name: 'Microsoft / Azure Speech', - descriptionKey: 'settings.pages.providers.provider.microsoft-speech.description', - description: 'speech.microsoft.com', - iconColor: 'i-lobe-icons:microsoft-color', - defaultOptions: { - baseUrl: 'https://unspeech.hyp3r.link/v1/', - }, - createProvider: config => createUnMicrosoft((config.apiKey as string).trim(), (config.baseUrl as string).trim()) as SpeechProviderWithExtraOptions, - capabilities: { - listModels: async () => { - return [ - { - id: 'v1', - name: 'v1', - provider: 'microsoft-speech', - description: '', - contextLength: 0, - deprecated: false, - }, - ] - }, - listVoices: async (config) => { - const provider = createUnMicrosoft((config.apiKey as string).trim(), (config.baseUrl as string).trim()) as VoiceProviderWithExtraOptions - - const voices = await listVoices({ - ...provider.voice({ region: config.region as string }), - }) - - return voices.map((voice) => { - return { - id: voice.id, - name: voice.name, - provider: 'microsoft-speech', - previewURL: voice.preview_audio_url, - languages: voice.languages, - gender: voice.labels?.gender, - } - }) - }, - }, - }, 'featherless-ai': { id: 'featherless-ai', nameKey: 'settings.pages.providers.provider.featherless.title',