mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-03-30 02:27:11 +00:00
feat: add gemini 2.5 flash image support
This commit is contained in:
@@ -84,10 +84,12 @@ var DefaultAntigravityModelMapping = map[string]string{
|
|||||||
"claude-haiku-4-5": "claude-sonnet-4-5",
|
"claude-haiku-4-5": "claude-sonnet-4-5",
|
||||||
"claude-haiku-4-5-20251001": "claude-sonnet-4-5",
|
"claude-haiku-4-5-20251001": "claude-sonnet-4-5",
|
||||||
// Gemini 2.5 白名单
|
// Gemini 2.5 白名单
|
||||||
"gemini-2.5-flash": "gemini-2.5-flash",
|
"gemini-2.5-flash": "gemini-2.5-flash",
|
||||||
"gemini-2.5-flash-lite": "gemini-2.5-flash-lite",
|
"gemini-2.5-flash-image": "gemini-2.5-flash-image",
|
||||||
"gemini-2.5-flash-thinking": "gemini-2.5-flash-thinking",
|
"gemini-2.5-flash-image-preview": "gemini-2.5-flash-image",
|
||||||
"gemini-2.5-pro": "gemini-2.5-pro",
|
"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 白名单
|
// Gemini 3 白名单
|
||||||
"gemini-3-flash": "gemini-3-flash",
|
"gemini-3-flash": "gemini-3-flash",
|
||||||
"gemini-3-pro-high": "gemini-3-pro-high",
|
"gemini-3-pro-high": "gemini-3-pro-high",
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ func TestDefaultAntigravityModelMapping_ImageCompatibilityAliases(t *testing.T)
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cases := map[string]string{
|
cases := map[string]string{
|
||||||
|
"gemini-2.5-flash-image": "gemini-2.5-flash-image",
|
||||||
|
"gemini-2.5-flash-image-preview": "gemini-2.5-flash-image",
|
||||||
"gemini-3.1-flash-image": "gemini-3.1-flash-image",
|
"gemini-3.1-flash-image": "gemini-3.1-flash-image",
|
||||||
"gemini-3.1-flash-image-preview": "gemini-3.1-flash-image",
|
"gemini-3.1-flash-image-preview": "gemini-3.1-flash-image",
|
||||||
"gemini-3-pro-image": "gemini-3.1-flash-image",
|
"gemini-3-pro-image": "gemini-3.1-flash-image",
|
||||||
|
|||||||
@@ -159,6 +159,8 @@ var claudeModels = []modelDef{
|
|||||||
// Antigravity 支持的 Gemini 模型
|
// Antigravity 支持的 Gemini 模型
|
||||||
var geminiModels = []modelDef{
|
var geminiModels = []modelDef{
|
||||||
{ID: "gemini-2.5-flash", DisplayName: "Gemini 2.5 Flash", CreatedAt: "2025-01-01T00:00:00Z"},
|
{ID: "gemini-2.5-flash", DisplayName: "Gemini 2.5 Flash", CreatedAt: "2025-01-01T00:00:00Z"},
|
||||||
|
{ID: "gemini-2.5-flash-image", DisplayName: "Gemini 2.5 Flash Image", CreatedAt: "2025-01-01T00:00:00Z"},
|
||||||
|
{ID: "gemini-2.5-flash-image-preview", DisplayName: "Gemini 2.5 Flash Image Preview", CreatedAt: "2025-01-01T00:00:00Z"},
|
||||||
{ID: "gemini-2.5-flash-lite", DisplayName: "Gemini 2.5 Flash Lite", CreatedAt: "2025-01-01T00:00:00Z"},
|
{ID: "gemini-2.5-flash-lite", DisplayName: "Gemini 2.5 Flash Lite", CreatedAt: "2025-01-01T00:00:00Z"},
|
||||||
{ID: "gemini-2.5-flash-thinking", DisplayName: "Gemini 2.5 Flash Thinking", CreatedAt: "2025-01-01T00:00:00Z"},
|
{ID: "gemini-2.5-flash-thinking", DisplayName: "Gemini 2.5 Flash Thinking", CreatedAt: "2025-01-01T00:00:00Z"},
|
||||||
{ID: "gemini-3-flash", DisplayName: "Gemini 3 Flash", CreatedAt: "2025-06-01T00:00:00Z"},
|
{ID: "gemini-3-flash", DisplayName: "Gemini 3 Flash", CreatedAt: "2025-06-01T00:00:00Z"},
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ func TestDefaultModels_ContainsNewAndLegacyImageModels(t *testing.T) {
|
|||||||
|
|
||||||
requiredIDs := []string{
|
requiredIDs := []string{
|
||||||
"claude-opus-4-6-thinking",
|
"claude-opus-4-6-thinking",
|
||||||
|
"gemini-2.5-flash-image",
|
||||||
|
"gemini-2.5-flash-image-preview",
|
||||||
"gemini-3.1-flash-image",
|
"gemini-3.1-flash-image",
|
||||||
"gemini-3.1-flash-image-preview",
|
"gemini-3.1-flash-image-preview",
|
||||||
"gemini-3-pro-image", // legacy compatibility
|
"gemini-3-pro-image", // legacy compatibility
|
||||||
|
|||||||
@@ -18,10 +18,12 @@ func DefaultModels() []Model {
|
|||||||
return []Model{
|
return []Model{
|
||||||
{Name: "models/gemini-2.0-flash", SupportedGenerationMethods: methods},
|
{Name: "models/gemini-2.0-flash", SupportedGenerationMethods: methods},
|
||||||
{Name: "models/gemini-2.5-flash", SupportedGenerationMethods: methods},
|
{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-2.5-pro", SupportedGenerationMethods: methods},
|
||||||
{Name: "models/gemini-3-flash-preview", SupportedGenerationMethods: methods},
|
{Name: "models/gemini-3-flash-preview", SupportedGenerationMethods: methods},
|
||||||
{Name: "models/gemini-3-pro-preview", SupportedGenerationMethods: methods},
|
{Name: "models/gemini-3-pro-preview", SupportedGenerationMethods: methods},
|
||||||
{Name: "models/gemini-3.1-pro-preview", SupportedGenerationMethods: methods},
|
{Name: "models/gemini-3.1-pro-preview", SupportedGenerationMethods: methods},
|
||||||
|
{Name: "models/gemini-3.1-flash-image", SupportedGenerationMethods: methods},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
28
backend/internal/pkg/gemini/models_test.go
Normal file
28
backend/internal/pkg/gemini/models_test.go
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package gemini
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestDefaultModels_ContainsImageModels(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
models := DefaultModels()
|
||||||
|
byName := make(map[string]Model, len(models))
|
||||||
|
for _, model := range models {
|
||||||
|
byName[model.Name] = model
|
||||||
|
}
|
||||||
|
|
||||||
|
required := []string{
|
||||||
|
"models/gemini-2.5-flash-image",
|
||||||
|
"models/gemini-3.1-flash-image",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range required {
|
||||||
|
model, ok := byName[name]
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("expected fallback model %q to exist", name)
|
||||||
|
}
|
||||||
|
if len(model.SupportedGenerationMethods) == 0 {
|
||||||
|
t.Fatalf("expected fallback model %q to advertise generation methods", name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,10 +13,12 @@ type Model struct {
|
|||||||
var DefaultModels = []Model{
|
var DefaultModels = []Model{
|
||||||
{ID: "gemini-2.0-flash", Type: "model", DisplayName: "Gemini 2.0 Flash", CreatedAt: ""},
|
{ID: "gemini-2.0-flash", Type: "model", DisplayName: "Gemini 2.0 Flash", CreatedAt: ""},
|
||||||
{ID: "gemini-2.5-flash", Type: "model", DisplayName: "Gemini 2.5 Flash", CreatedAt: ""},
|
{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-2.5-pro", Type: "model", DisplayName: "Gemini 2.5 Pro", CreatedAt: ""},
|
||||||
{ID: "gemini-3-flash-preview", Type: "model", DisplayName: "Gemini 3 Flash Preview", 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-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: ""},
|
{ID: "gemini-3.1-pro-preview", Type: "model", DisplayName: "Gemini 3.1 Pro Preview", CreatedAt: ""},
|
||||||
|
{ID: "gemini-3.1-flash-image", Type: "model", DisplayName: "Gemini 3.1 Flash Image", CreatedAt: ""},
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultTestModel is the default model to preselect in test flows.
|
// DefaultTestModel is the default model to preselect in test flows.
|
||||||
|
|||||||
23
backend/internal/pkg/geminicli/models_test.go
Normal file
23
backend/internal/pkg/geminicli/models_test.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package geminicli
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestDefaultModels_ContainsImageModels(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
byID := make(map[string]Model, len(DefaultModels))
|
||||||
|
for _, model := range DefaultModels {
|
||||||
|
byID[model.ID] = model
|
||||||
|
}
|
||||||
|
|
||||||
|
required := []string{
|
||||||
|
"gemini-2.5-flash-image",
|
||||||
|
"gemini-3.1-flash-image",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, id := range required {
|
||||||
|
if _, ok := byID[id]; !ok {
|
||||||
|
t.Fatalf("expected curated Gemini model %q to exist", id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
-- Add gemini-2.5-flash-image aliases to Antigravity model_mapping
|
||||||
|
--
|
||||||
|
-- Background:
|
||||||
|
-- Gemini native image generation now relies on gemini-2.5-flash-image, and
|
||||||
|
-- existing Antigravity accounts with persisted model_mapping need this alias in
|
||||||
|
-- order to participate in mixed scheduling from gemini groups.
|
||||||
|
--
|
||||||
|
-- Strategy:
|
||||||
|
-- Overwrite the stored model_mapping so it matches DefaultAntigravityModelMapping
|
||||||
|
-- in constants.go, including legacy gemini-3-pro-image aliases.
|
||||||
|
|
||||||
|
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-image": "gemini-2.5-flash-image",
|
||||||
|
"gemini-2.5-flash-image-preview": "gemini-2.5-flash-image",
|
||||||
|
"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",
|
||||||
|
"gemini-3-pro-image": "gemini-3.1-flash-image",
|
||||||
|
"gemini-3-pro-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;
|
||||||
@@ -176,6 +176,7 @@ const formatScopeName = (scope: string): string => {
|
|||||||
'gemini-2.5-flash-lite': 'G25FL',
|
'gemini-2.5-flash-lite': 'G25FL',
|
||||||
'gemini-2.5-flash-thinking': 'G25FT',
|
'gemini-2.5-flash-thinking': 'G25FT',
|
||||||
'gemini-2.5-pro': 'G25P',
|
'gemini-2.5-pro': 'G25P',
|
||||||
|
'gemini-2.5-flash-image': 'G25I',
|
||||||
// Gemini 3 系列
|
// Gemini 3 系列
|
||||||
'gemini-3-flash': 'G3F',
|
'gemini-3-flash': 'G3F',
|
||||||
'gemini-3.1-pro-high': 'G3PH',
|
'gemini-3.1-pro-high': 'G3PH',
|
||||||
|
|||||||
@@ -521,7 +521,7 @@ const antigravity3FlashUsageFromAPI = computed(() => getAntigravityUsageFromAPI(
|
|||||||
|
|
||||||
// Gemini Image from API
|
// Gemini Image from API
|
||||||
const antigravity3ImageUsageFromAPI = computed(() =>
|
const antigravity3ImageUsageFromAPI = computed(() =>
|
||||||
getAntigravityUsageFromAPI(['gemini-3.1-flash-image', 'gemini-3-pro-image'])
|
getAntigravityUsageFromAPI(['gemini-2.5-flash-image', 'gemini-3.1-flash-image', 'gemini-3-pro-image'])
|
||||||
)
|
)
|
||||||
|
|
||||||
// Claude from API (all Claude model variants)
|
// Claude from API (all Claude model variants)
|
||||||
|
|||||||
@@ -961,6 +961,7 @@ const allModels = [
|
|||||||
{ value: 'gpt-5-2025-08-07', label: 'GPT-5' },
|
{ value: 'gpt-5-2025-08-07', label: 'GPT-5' },
|
||||||
{ value: 'gemini-2.0-flash', label: 'Gemini 2.0 Flash' },
|
{ value: 'gemini-2.0-flash', label: 'Gemini 2.0 Flash' },
|
||||||
{ value: 'gemini-2.5-flash', label: 'Gemini 2.5 Flash' },
|
{ value: 'gemini-2.5-flash', label: 'Gemini 2.5 Flash' },
|
||||||
|
{ value: 'gemini-2.5-flash-image', label: 'Gemini 2.5 Flash Image' },
|
||||||
{ value: 'gemini-2.5-pro', label: 'Gemini 2.5 Pro' },
|
{ value: 'gemini-2.5-pro', label: 'Gemini 2.5 Pro' },
|
||||||
{ value: 'gemini-3.1-flash-image', label: 'Gemini 3.1 Flash Image' },
|
{ value: 'gemini-3.1-flash-image', label: 'Gemini 3.1 Flash Image' },
|
||||||
{ value: 'gemini-3-pro-image', label: 'Gemini 3 Pro Image (Legacy)' },
|
{ value: 'gemini-3-pro-image', label: 'Gemini 3 Pro Image (Legacy)' },
|
||||||
@@ -1042,6 +1043,12 @@ const presetMappings = [
|
|||||||
to: 'claude-sonnet-4-5-20250929',
|
to: 'claude-sonnet-4-5-20250929',
|
||||||
color: 'bg-amber-100 text-amber-700 hover:bg-amber-200 dark:bg-amber-900/30 dark:text-amber-400'
|
color: 'bg-amber-100 text-amber-700 hover:bg-amber-200 dark:bg-amber-900/30 dark:text-amber-400'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Gemini 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: 'Gemini 3.1 Image',
|
label: 'Gemini 3.1 Image',
|
||||||
from: 'gemini-3.1-flash-image',
|
from: 'gemini-3.1-flash-image',
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ describe('AccountUsageCell', () => {
|
|||||||
it('Antigravity 图片用量会聚合新旧 image 模型', async () => {
|
it('Antigravity 图片用量会聚合新旧 image 模型', async () => {
|
||||||
getUsage.mockResolvedValue({
|
getUsage.mockResolvedValue({
|
||||||
antigravity_quota: {
|
antigravity_quota: {
|
||||||
|
'gemini-2.5-flash-image': {
|
||||||
|
utilization: 45,
|
||||||
|
reset_time: '2026-03-01T11:00:00Z'
|
||||||
|
},
|
||||||
'gemini-3.1-flash-image': {
|
'gemini-3.1-flash-image': {
|
||||||
utilization: 20,
|
utilization: 20,
|
||||||
reset_time: '2026-03-01T10:00:00Z'
|
reset_time: '2026-03-01T10:00:00Z'
|
||||||
|
|||||||
@@ -959,6 +959,23 @@ function generateOpenCodeConfig(platform: string, baseUrl: string, apiKey: strin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
'gemini-2.5-flash-image': {
|
||||||
|
name: 'Gemini 2.5 Flash Image',
|
||||||
|
limit: {
|
||||||
|
context: 1048576,
|
||||||
|
output: 65536
|
||||||
|
},
|
||||||
|
modalities: {
|
||||||
|
input: ['text', 'image'],
|
||||||
|
output: ['image']
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
thinking: {
|
||||||
|
budgetTokens: 24576,
|
||||||
|
type: 'enabled'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
'gemini-3.1-flash-image': {
|
'gemini-3.1-flash-image': {
|
||||||
name: 'Gemini 3.1 Flash Image',
|
name: 'Gemini 3.1 Flash Image',
|
||||||
limit: {
|
limit: {
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
import { describe, expect, it } from 'vitest'
|
import { describe, expect, it, vi } from 'vitest'
|
||||||
|
|
||||||
|
vi.mock('@/api/admin/accounts', () => ({
|
||||||
|
getAntigravityDefaultModelMapping: vi.fn()
|
||||||
|
}))
|
||||||
|
|
||||||
import { buildModelMappingObject, getModelsByPlatform } from '../useModelWhitelist'
|
import { buildModelMappingObject, getModelsByPlatform } from '../useModelWhitelist'
|
||||||
|
|
||||||
describe('useModelWhitelist', () => {
|
describe('useModelWhitelist', () => {
|
||||||
@@ -12,10 +17,18 @@ describe('useModelWhitelist', () => {
|
|||||||
it('antigravity 模型列表包含图片模型兼容项', () => {
|
it('antigravity 模型列表包含图片模型兼容项', () => {
|
||||||
const models = getModelsByPlatform('antigravity')
|
const models = getModelsByPlatform('antigravity')
|
||||||
|
|
||||||
|
expect(models).toContain('gemini-2.5-flash-image')
|
||||||
expect(models).toContain('gemini-3.1-flash-image')
|
expect(models).toContain('gemini-3.1-flash-image')
|
||||||
expect(models).toContain('gemini-3-pro-image')
|
expect(models).toContain('gemini-3-pro-image')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('gemini 模型列表包含原生生图模型', () => {
|
||||||
|
const models = getModelsByPlatform('gemini')
|
||||||
|
|
||||||
|
expect(models).toContain('gemini-2.5-flash-image')
|
||||||
|
expect(models).toContain('gemini-3.1-flash-image')
|
||||||
|
})
|
||||||
|
|
||||||
it('whitelist 模式会忽略通配符条目', () => {
|
it('whitelist 模式会忽略通配符条目', () => {
|
||||||
const mapping = buildModelMappingObject('whitelist', ['claude-*', 'gemini-3.1-flash-image'], [])
|
const mapping = buildModelMappingObject('whitelist', ['claude-*', 'gemini-3.1-flash-image'], [])
|
||||||
expect(mapping).toEqual({
|
expect(mapping).toEqual({
|
||||||
|
|||||||
@@ -53,9 +53,11 @@ const geminiModels = [
|
|||||||
// This list is intentionally conservative (models commonly available across OAuth/API key).
|
// This list is intentionally conservative (models commonly available across OAuth/API key).
|
||||||
'gemini-2.0-flash',
|
'gemini-2.0-flash',
|
||||||
'gemini-2.5-flash',
|
'gemini-2.5-flash',
|
||||||
|
'gemini-2.5-flash-image',
|
||||||
'gemini-2.5-pro',
|
'gemini-2.5-pro',
|
||||||
'gemini-3-flash-preview',
|
'gemini-3-flash-preview',
|
||||||
'gemini-3-pro-preview'
|
'gemini-3-pro-preview',
|
||||||
|
'gemini-3.1-flash-image'
|
||||||
]
|
]
|
||||||
|
|
||||||
// Sora
|
// Sora
|
||||||
@@ -86,6 +88,7 @@ const antigravityModels = [
|
|||||||
'claude-sonnet-4-5-thinking',
|
'claude-sonnet-4-5-thinking',
|
||||||
// Gemini 2.5 系列
|
// Gemini 2.5 系列
|
||||||
'gemini-2.5-flash',
|
'gemini-2.5-flash',
|
||||||
|
'gemini-2.5-flash-image',
|
||||||
'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',
|
||||||
@@ -291,7 +294,9 @@ const soraPresetMappings: { label: string; from: string; to: string; color: stri
|
|||||||
const geminiPresetMappings = [
|
const geminiPresetMappings = [
|
||||||
{ label: 'Flash 2.0', from: 'gemini-2.0-flash', to: 'gemini-2.0-flash', color: 'bg-blue-100 text-blue-700 hover:bg-blue-200 dark:bg-blue-900/30 dark:text-blue-400' },
|
{ label: 'Flash 2.0', from: 'gemini-2.0-flash', to: 'gemini-2.0-flash', color: 'bg-blue-100 text-blue-700 hover:bg-blue-200 dark:bg-blue-900/30 dark:text-blue-400' },
|
||||||
{ 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 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 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: '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.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' }
|
||||||
]
|
]
|
||||||
|
|
||||||
// Antigravity 预设映射(支持通配符)
|
// Antigravity 预设映射(支持通配符)
|
||||||
@@ -314,6 +319,9 @@ const antigravityPresetMappings = [
|
|||||||
// Gemini 通配符映射
|
// Gemini 通配符映射
|
||||||
{ label: 'Gemini 3→Flash', from: 'gemini-3*', to: 'gemini-3-flash', color: 'bg-yellow-100 text-yellow-700 hover:bg-yellow-200 dark:bg-yellow-900/30 dark:text-yellow-400' },
|
{ label: 'Gemini 3→Flash', from: 'gemini-3*', to: 'gemini-3-flash', color: 'bg-yellow-100 text-yellow-700 hover:bg-yellow-200 dark:bg-yellow-900/30 dark:text-yellow-400' },
|
||||||
{ label: 'Gemini 2.5→Flash', from: 'gemini-2.5*', to: 'gemini-2.5-flash', color: 'bg-orange-100 text-orange-700 hover:bg-orange-200 dark:bg-orange-900/30 dark:text-orange-400' },
|
{ label: 'Gemini 2.5→Flash', from: 'gemini-2.5*', to: 'gemini-2.5-flash', color: 'bg-orange-100 text-orange-700 hover:bg-orange-200 dark:bg-orange-900/30 dark:text-orange-400' },
|
||||||
|
{ label: '2.5-Flash-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: '3.1-Flash-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' },
|
||||||
|
{ label: '3-Pro-Image→3.1', from: 'gemini-3-pro-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' },
|
||||||
{ label: '3-Flash透传', from: 'gemini-3-flash', to: 'gemini-3-flash', color: 'bg-lime-100 text-lime-700 hover:bg-lime-200 dark:bg-lime-900/30 dark:text-lime-400' },
|
{ label: '3-Flash透传', from: 'gemini-3-flash', to: 'gemini-3-flash', color: 'bg-lime-100 text-lime-700 hover:bg-lime-200 dark:bg-lime-900/30 dark:text-lime-400' },
|
||||||
{ label: '2.5-Flash-Lite透传', from: 'gemini-2.5-flash-lite', to: 'gemini-2.5-flash-lite', color: 'bg-green-100 text-green-700 hover:bg-green-200 dark:bg-green-900/30 dark:text-green-400' },
|
{ label: '2.5-Flash-Lite透传', from: 'gemini-2.5-flash-lite', to: 'gemini-2.5-flash-lite', color: 'bg-green-100 text-green-700 hover:bg-green-200 dark:bg-green-900/30 dark:text-green-400' },
|
||||||
// 精确映射
|
// 精确映射
|
||||||
|
|||||||
Reference in New Issue
Block a user