From 3d22dd34d3de9076804858f979f60fccdf9f2de1 Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 20 May 2026 09:28:46 +0800 Subject: [PATCH] feat: add gemini-3.5-flash model support across backend and frontend --- backend/internal/pkg/gemini/models.go | 1 + backend/internal/pkg/geminicli/models.go | 1 + .../src/components/account/AccountStatusIndicator.vue | 2 ++ frontend/src/components/account/AccountTestModal.vue | 2 +- .../src/components/admin/account/AccountTestModal.vue | 2 +- frontend/src/components/keys/UseKeyModal.vue | 11 +++++++++++ frontend/src/composables/useModelWhitelist.ts | 2 ++ 7 files changed, 19 insertions(+), 2 deletions(-) diff --git a/backend/internal/pkg/gemini/models.go b/backend/internal/pkg/gemini/models.go index fac79d18..d5d4ed64 100644 --- a/backend/internal/pkg/gemini/models.go +++ b/backend/internal/pkg/gemini/models.go @@ -22,6 +22,7 @@ func DefaultModels() []Model { {Name: "models/gemini-2.5-flash", SupportedGenerationMethods: methods}, {Name: "models/gemini-2.5-flash-image", SupportedGenerationMethods: methods}, {Name: "models/gemini-2.5-pro", SupportedGenerationMethods: methods}, + {Name: "models/gemini-3.5-flash", SupportedGenerationMethods: methods}, {Name: "models/gemini-3-flash-preview", SupportedGenerationMethods: methods}, {Name: "models/gemini-3-pro-preview", SupportedGenerationMethods: methods}, {Name: "models/gemini-3.1-pro-preview", SupportedGenerationMethods: methods}, diff --git a/backend/internal/pkg/geminicli/models.go b/backend/internal/pkg/geminicli/models.go index 195fb06f..bbd9a6c4 100644 --- a/backend/internal/pkg/geminicli/models.go +++ b/backend/internal/pkg/geminicli/models.go @@ -15,6 +15,7 @@ var DefaultModels = []Model{ {ID: "gemini-2.5-flash", Type: "model", DisplayName: "Gemini 2.5 Flash", CreatedAt: ""}, {ID: "gemini-2.5-flash-image", Type: "model", DisplayName: "Gemini 2.5 Flash Image", CreatedAt: ""}, {ID: "gemini-2.5-pro", Type: "model", DisplayName: "Gemini 2.5 Pro", CreatedAt: ""}, + {ID: "gemini-3.5-flash", Type: "model", DisplayName: "Gemini 3.5 Flash", CreatedAt: ""}, {ID: "gemini-3-flash-preview", Type: "model", DisplayName: "Gemini 3 Flash Preview", CreatedAt: ""}, {ID: "gemini-3-pro-preview", Type: "model", DisplayName: "Gemini 3 Pro Preview", CreatedAt: ""}, {ID: "gemini-3.1-pro-preview", Type: "model", DisplayName: "Gemini 3.1 Pro Preview", CreatedAt: ""}, diff --git a/frontend/src/components/account/AccountStatusIndicator.vue b/frontend/src/components/account/AccountStatusIndicator.vue index dd38a49f..8438c584 100644 --- a/frontend/src/components/account/AccountStatusIndicator.vue +++ b/frontend/src/components/account/AccountStatusIndicator.vue @@ -231,6 +231,8 @@ const formatScopeName = (scope: string): string => { 'gemini-2.5-flash-thinking': 'G25FT', 'gemini-2.5-pro': 'G25P', 'gemini-2.5-flash-image': 'G25I', + // Gemini 3.5 系列 + 'gemini-3.5-flash': 'G35F', // Gemini 3 系列 'gemini-3-flash': 'G3F', 'gemini-3.1-pro-high': 'G3PH', diff --git a/frontend/src/components/account/AccountTestModal.vue b/frontend/src/components/account/AccountTestModal.vue index 236f85f1..222d2505 100644 --- a/frontend/src/components/account/AccountTestModal.vue +++ b/frontend/src/components/account/AccountTestModal.vue @@ -292,7 +292,7 @@ const openAITestModeOptions = computed(() => [ { value: 'compact', label: t('admin.accounts.openai.testModeCompact') } ]) const previewImageUrl = ref('') -const prioritizedGeminiModels = ['gemini-3.1-flash-image', 'gemini-2.5-flash-image', 'gemini-2.5-flash', 'gemini-2.5-pro', 'gemini-3-flash-preview', 'gemini-3-pro-preview', 'gemini-2.0-flash'] +const prioritizedGeminiModels = ['gemini-3.1-flash-image', 'gemini-2.5-flash-image', 'gemini-3.5-flash', 'gemini-2.5-flash', 'gemini-2.5-pro', 'gemini-3-flash-preview', 'gemini-3-pro-preview', 'gemini-2.0-flash'] const supportsGeminiImageTest = computed(() => { const modelID = selectedModelId.value.toLowerCase() if (!modelID.startsWith('gemini-') || !modelID.includes('-image')) return false diff --git a/frontend/src/components/admin/account/AccountTestModal.vue b/frontend/src/components/admin/account/AccountTestModal.vue index 2e3db61b..86354906 100644 --- a/frontend/src/components/admin/account/AccountTestModal.vue +++ b/frontend/src/components/admin/account/AccountTestModal.vue @@ -275,7 +275,7 @@ const loadingModels = ref(false) let abortController: AbortController | null = null const generatedImages = ref([]) const previewImageUrl = ref('') -const prioritizedGeminiModels = ['gemini-3.1-flash-image', 'gemini-2.5-flash-image', 'gemini-2.5-flash', 'gemini-2.5-pro', 'gemini-3-flash-preview', 'gemini-3-pro-preview', 'gemini-2.0-flash'] +const prioritizedGeminiModels = ['gemini-3.1-flash-image', 'gemini-2.5-flash-image', 'gemini-3.5-flash', 'gemini-2.5-flash', 'gemini-2.5-pro', 'gemini-3-flash-preview', 'gemini-3-pro-preview', 'gemini-2.0-flash'] const supportsGeminiImageTest = computed(() => { const modelID = selectedModelId.value.toLowerCase() if (!modelID.startsWith('gemini-') || !modelID.includes('-image')) return false diff --git a/frontend/src/components/keys/UseKeyModal.vue b/frontend/src/components/keys/UseKeyModal.vue index 94010b62..0f2037ed 100644 --- a/frontend/src/components/keys/UseKeyModal.vue +++ b/frontend/src/components/keys/UseKeyModal.vue @@ -769,6 +769,17 @@ function generateOpenCodeConfig(platform: string, baseUrl: string, apiKey: strin } } }, + 'gemini-3.5-flash': { + name: 'Gemini 3.5 Flash', + limit: { + context: 1048576, + output: 65536 + }, + modalities: { + input: ['text', 'image', 'pdf'], + output: ['text'] + } + }, 'gemini-3-flash-preview': { name: 'Gemini 3 Flash Preview', limit: { diff --git a/frontend/src/composables/useModelWhitelist.ts b/frontend/src/composables/useModelWhitelist.ts index ad2dc103..1f747595 100644 --- a/frontend/src/composables/useModelWhitelist.ts +++ b/frontend/src/composables/useModelWhitelist.ts @@ -41,6 +41,7 @@ const geminiModels = [ 'gemini-2.0-flash', 'gemini-2.5-flash', 'gemini-2.5-pro', + 'gemini-3.5-flash', 'gemini-3-flash-preview', 'gemini-3-pro-preview' ] @@ -262,6 +263,7 @@ const geminiPresetMappings = [ { label: '2.5 Flash', from: 'gemini-2.5-flash', to: 'gemini-2.5-flash', color: 'bg-indigo-100 text-indigo-700 hover:bg-indigo-200 dark:bg-indigo-900/30 dark:text-indigo-400' }, { label: '2.5 Image', from: 'gemini-2.5-flash-image', to: 'gemini-2.5-flash-image', color: 'bg-sky-100 text-sky-700 hover:bg-sky-200 dark:bg-sky-900/30 dark:text-sky-400' }, { label: '2.5 Pro', from: 'gemini-2.5-pro', to: 'gemini-2.5-pro', color: 'bg-purple-100 text-purple-700 hover:bg-purple-200 dark:bg-purple-900/30 dark:text-purple-400' }, + { label: '3.5 Flash', from: 'gemini-3.5-flash', to: 'gemini-3.5-flash', color: 'bg-violet-100 text-violet-700 hover:bg-violet-200 dark:bg-violet-900/30 dark:text-violet-400' }, { label: '3.1 Image', from: 'gemini-3.1-flash-image', to: 'gemini-3.1-flash-image', color: 'bg-sky-100 text-sky-700 hover:bg-sky-200 dark:bg-sky-900/30 dark:text-sky-400' } ]