diff --git a/backend/internal/domain/constants.go b/backend/internal/domain/constants.go index c41aa65f..d56dfa86 100644 --- a/backend/internal/domain/constants.go +++ b/backend/internal/domain/constants.go @@ -89,19 +89,21 @@ var DefaultAntigravityModelMapping = map[string]string{ "gemini-2.5-flash-thinking": "gemini-2.5-flash-thinking", "gemini-2.5-pro": "gemini-2.5-pro", // Gemini 3 白名单 - "gemini-3-flash": "gemini-3-flash", - "gemini-3-pro-high": "gemini-3-pro-high", - "gemini-3-pro-low": "gemini-3-pro-low", - "gemini-3-pro-image": "gemini-3-pro-image", + "gemini-3-flash": "gemini-3-flash", + "gemini-3-pro-high": "gemini-3-pro-high", + "gemini-3-pro-low": "gemini-3-pro-low", // Gemini 3 preview 映射 - "gemini-3-flash-preview": "gemini-3-flash", - "gemini-3-pro-preview": "gemini-3-pro-high", - "gemini-3-pro-image-preview": "gemini-3-pro-image", + "gemini-3-flash-preview": "gemini-3-flash", + "gemini-3-pro-preview": "gemini-3-pro-high", // Gemini 3.1 白名单 "gemini-3.1-pro-high": "gemini-3.1-pro-high", "gemini-3.1-pro-low": "gemini-3.1-pro-low", // Gemini 3.1 preview 映射 "gemini-3.1-pro-preview": "gemini-3.1-pro-high", + // Gemini 3.1 image 白名单 + "gemini-3.1-flash-image": "gemini-3.1-flash-image", + // Gemini 3.1 image preview 映射 + "gemini-3.1-flash-image-preview": "gemini-3.1-flash-image", // 其他官方模型 "gpt-oss-120b-medium": "gpt-oss-120b-medium", "tab_flash_lite_preview": "tab_flash_lite_preview", diff --git a/backend/internal/service/antigravity_gateway_service.go b/backend/internal/service/antigravity_gateway_service.go index 108ff9ab..2bd6195a 100644 --- a/backend/internal/service/antigravity_gateway_service.go +++ b/backend/internal/service/antigravity_gateway_service.go @@ -3757,14 +3757,17 @@ func (s *AntigravityGatewayService) extractImageSize(body []byte) string { } // isImageGenerationModel 判断模型是否为图片生成模型 -// 支持的模型:gemini-3-pro-image, gemini-3-pro-image-preview, gemini-2.5-flash-image 等 +// 支持的模型:gemini-3.1-flash-image, gemini-3-pro-image, gemini-2.5-flash-image 等 func isImageGenerationModel(model string) bool { modelLower := strings.ToLower(model) // 移除 models/ 前缀 modelLower = strings.TrimPrefix(modelLower, "models/") // 精确匹配或前缀匹配 - return modelLower == "gemini-3-pro-image" || + return modelLower == "gemini-3.1-flash-image" || + modelLower == "gemini-3.1-flash-image-preview" || + strings.HasPrefix(modelLower, "gemini-3.1-flash-image-") || + modelLower == "gemini-3-pro-image" || modelLower == "gemini-3-pro-image-preview" || strings.HasPrefix(modelLower, "gemini-3-pro-image-") || modelLower == "gemini-2.5-flash-image" || diff --git a/backend/internal/service/gateway_service.go b/backend/internal/service/gateway_service.go index 02a4b012..3fabead0 100644 --- a/backend/internal/service/gateway_service.go +++ b/backend/internal/service/gateway_service.go @@ -470,7 +470,7 @@ type ForwardResult struct { FirstTokenMs *int // 首字时间(流式请求) ClientDisconnect bool // 客户端是否在流式传输过程中断开 - // 图片生成计费字段(仅 gemini-3-pro-image 使用) + // 图片生成计费字段(图片生成模型使用) ImageCount int // 生成的图片数量 ImageSize string // 图片尺寸 "1K", "2K", "4K" diff --git a/backend/migrations/060_add_gemini31_flash_image_to_model_mapping.sql b/backend/migrations/060_add_gemini31_flash_image_to_model_mapping.sql new file mode 100644 index 00000000..de9d5776 --- /dev/null +++ b/backend/migrations/060_add_gemini31_flash_image_to_model_mapping.sql @@ -0,0 +1,46 @@ +-- Add gemini-3.1-flash-image and gemini-3.1-flash-image-preview to model_mapping +-- +-- Background: +-- Antigravity now supports gemini-3.1-flash-image as the latest image generation model, +-- replacing the previous gemini-3-pro-image. +-- +-- Strategy: +-- Directly overwrite the entire model_mapping with updated mappings +-- This ensures consistency with DefaultAntigravityModelMapping in constants.go + +UPDATE accounts +SET credentials = jsonb_set( + credentials, + '{model_mapping}', + '{ + "claude-opus-4-6-thinking": "claude-opus-4-6-thinking", + "claude-opus-4-6": "claude-opus-4-6-thinking", + "claude-opus-4-5-thinking": "claude-opus-4-6-thinking", + "claude-opus-4-5-20251101": "claude-opus-4-6-thinking", + "claude-sonnet-4-6": "claude-sonnet-4-6", + "claude-sonnet-4-5": "claude-sonnet-4-5", + "claude-sonnet-4-5-thinking": "claude-sonnet-4-5-thinking", + "claude-sonnet-4-5-20250929": "claude-sonnet-4-5", + "claude-haiku-4-5": "claude-sonnet-4-5", + "claude-haiku-4-5-20251001": "claude-sonnet-4-5", + "gemini-2.5-flash": "gemini-2.5-flash", + "gemini-2.5-flash-lite": "gemini-2.5-flash-lite", + "gemini-2.5-flash-thinking": "gemini-2.5-flash-thinking", + "gemini-2.5-pro": "gemini-2.5-pro", + "gemini-3-flash": "gemini-3-flash", + "gemini-3-pro-high": "gemini-3-pro-high", + "gemini-3-pro-low": "gemini-3-pro-low", + "gemini-3-flash-preview": "gemini-3-flash", + "gemini-3-pro-preview": "gemini-3-pro-high", + "gemini-3.1-pro-high": "gemini-3.1-pro-high", + "gemini-3.1-pro-low": "gemini-3.1-pro-low", + "gemini-3.1-pro-preview": "gemini-3.1-pro-high", + "gemini-3.1-flash-image": "gemini-3.1-flash-image", + "gemini-3.1-flash-image-preview": "gemini-3.1-flash-image", + "gpt-oss-120b-medium": "gpt-oss-120b-medium", + "tab_flash_lite_preview": "tab_flash_lite_preview" + }'::jsonb +) +WHERE platform = 'antigravity' + AND deleted_at IS NULL + AND credentials->'model_mapping' IS NOT NULL; diff --git a/frontend/src/components/account/AccountStatusIndicator.vue b/frontend/src/components/account/AccountStatusIndicator.vue index 37285734..e8331c25 100644 --- a/frontend/src/components/account/AccountStatusIndicator.vue +++ b/frontend/src/components/account/AccountStatusIndicator.vue @@ -181,6 +181,7 @@ const formatScopeName = (scope: string): string => { 'gemini-3.1-pro-high': 'G3PH', 'gemini-3.1-pro-low': 'G3PL', 'gemini-3-pro-image': 'G3PI', + 'gemini-3.1-flash-image': 'GImage', // 其他 'gpt-oss-120b-medium': 'GPT120', 'tab_flash_lite_preview': 'TabFL', diff --git a/frontend/src/components/account/AccountUsageCell.vue b/frontend/src/components/account/AccountUsageCell.vue index 8399cb4d..12fab57d 100644 --- a/frontend/src/components/account/AccountUsageCell.vue +++ b/frontend/src/components/account/AccountUsageCell.vue @@ -397,8 +397,8 @@ const antigravity3ProUsageFromAPI = computed(() => // Gemini 3 Flash from API const antigravity3FlashUsageFromAPI = computed(() => getAntigravityUsageFromAPI(['gemini-3-flash'])) -// Gemini 3 Image from API -const antigravity3ImageUsageFromAPI = computed(() => getAntigravityUsageFromAPI(['gemini-3-pro-image'])) +// Gemini Image from API +const antigravity3ImageUsageFromAPI = computed(() => getAntigravityUsageFromAPI(['gemini-3.1-flash-image'])) // Claude from API (all Claude model variants) const antigravityClaudeUsageFromAPI = computed(() => diff --git a/frontend/src/components/keys/UseKeyModal.vue b/frontend/src/components/keys/UseKeyModal.vue index 8b07e2ce..4f606410 100644 --- a/frontend/src/components/keys/UseKeyModal.vue +++ b/frontend/src/components/keys/UseKeyModal.vue @@ -864,8 +864,8 @@ function generateOpenCodeConfig(platform: string, baseUrl: string, apiKey: strin } } }, - 'gemini-3-pro-image': { - name: 'Gemini 3 Pro (Image)', + 'gemini-3.1-flash-image': { + name: 'Gemini 3.1 Flash Image', limit: { context: 1048576, output: 65536 diff --git a/frontend/src/composables/useModelWhitelist.ts b/frontend/src/composables/useModelWhitelist.ts index 88f21d53..601d5d9d 100644 --- a/frontend/src/composables/useModelWhitelist.ts +++ b/frontend/src/composables/useModelWhitelist.ts @@ -91,10 +91,10 @@ const antigravityModels = [ 'gemini-3-flash', 'gemini-3-pro-high', 'gemini-3-pro-low', - 'gemini-3-pro-image', // Gemini 3.1 系列 'gemini-3.1-pro-high', 'gemini-3.1-pro-low', + 'gemini-3.1-flash-image', // 其他 'gpt-oss-120b-medium', 'tab_flash_lite_preview' diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index b2eac925..76ab5c87 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -1133,7 +1133,7 @@ export default { }, imagePricing: { title: 'Image Generation Pricing', - description: 'Configure pricing for gemini-3-pro-image model. Leave empty to use default prices.' + description: 'Configure pricing for image generation models. Leave empty to use default prices.' }, soraPricing: { title: 'Sora Per-Request Pricing', @@ -2047,7 +2047,7 @@ export default { geminiFlashDaily: 'Flash', gemini3Pro: 'G3P', gemini3Flash: 'G3F', - gemini3Image: 'G3I', + gemini3Image: 'GImage', claude: 'Claude' }, tier: { diff --git a/frontend/src/i18n/locales/zh.ts b/frontend/src/i18n/locales/zh.ts index 8366f9c4..33e358ce 100644 --- a/frontend/src/i18n/locales/zh.ts +++ b/frontend/src/i18n/locales/zh.ts @@ -1220,7 +1220,7 @@ export default { }, imagePricing: { title: '图片生成计费', - description: '配置 gemini-3-pro-image 模型的图片生成价格,留空则使用默认价格' + description: '配置图片生成模型的图片生成价格,留空则使用默认价格' }, soraPricing: { title: 'Sora 按次计费', @@ -1582,7 +1582,7 @@ export default { geminiFlashDaily: 'Flash', gemini3Pro: 'G3P', gemini3Flash: 'G3F', - gemini3Image: 'G3I', + gemini3Image: 'GImage', claude: 'Claude' }, tier: {