Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
1c0519f1
Commit
1c0519f1
authored
Mar 11, 2026
by
Rose Ding
Browse files
feat: add gemini 2.5 flash image support
parent
7455476c
Changes
16
Hide whitespace changes
Inline
Side-by-side
backend/internal/domain/constants.go
View file @
1c0519f1
...
@@ -84,10 +84,12 @@ var DefaultAntigravityModelMapping = map[string]string{
...
@@ -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"
,
...
...
backend/internal/domain/constants_test.go
View file @
1c0519f1
...
@@ -6,6 +6,8 @@ func TestDefaultAntigravityModelMapping_ImageCompatibilityAliases(t *testing.T)
...
@@ -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"
,
...
...
backend/internal/pkg/antigravity/claude_types.go
View file @
1c0519f1
...
@@ -159,6 +159,8 @@ var claudeModels = []modelDef{
...
@@ -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"
},
...
...
backend/internal/pkg/antigravity/claude_types_test.go
View file @
1c0519f1
...
@@ -13,6 +13,8 @@ func TestDefaultModels_ContainsNewAndLegacyImageModels(t *testing.T) {
...
@@ -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
...
...
backend/internal/pkg/gemini/models.go
View file @
1c0519f1
...
@@ -18,10 +18,12 @@ func DefaultModels() []Model {
...
@@ -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
},
}
}
}
}
...
...
backend/internal/pkg/gemini/models_test.go
0 → 100644
View file @
1c0519f1
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
)
}
}
}
backend/internal/pkg/geminicli/models.go
View file @
1c0519f1
...
@@ -13,10 +13,12 @@ type Model struct {
...
@@ -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.
...
...
backend/internal/pkg/geminicli/models_test.go
0 → 100644
View file @
1c0519f1
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
)
}
}
}
backend/migrations/071_add_gemini25_flash_image_to_model_mapping.sql
0 → 100644
View file @
1c0519f1
-- 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
;
frontend/src/components/account/AccountStatusIndicator.vue
View file @
1c0519f1
...
@@ -176,6 +176,7 @@ const formatScopeName = (scope: string): string => {
...
@@ -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
'
,
...
...
frontend/src/components/account/AccountUsageCell.vue
View file @
1c0519f1
...
@@ -521,7 +521,7 @@ const antigravity3FlashUsageFromAPI = computed(() => getAntigravityUsageFromAPI(
...
@@ -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)
...
...
frontend/src/components/account/BulkEditAccountModal.vue
View file @
1c0519f1
...
@@ -961,6 +961,7 @@ const allModels = [
...
@@ -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 = [
...
@@ -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
'
,
...
...
frontend/src/components/account/__tests__/AccountUsageCell.spec.ts
View file @
1c0519f1
...
@@ -32,6 +32,10 @@ describe('AccountUsageCell', () => {
...
@@ -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
'
...
...
frontend/src/components/keys/UseKeyModal.vue
View file @
1c0519f1
...
@@ -959,6 +959,23 @@ function generateOpenCodeConfig(platform: string, baseUrl: string, apiKey: strin
...
@@ -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
:
{
...
...
frontend/src/composables/__tests__/useModelWhitelist.spec.ts
View file @
1c0519f1
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', () => {
...
@@ -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
({
...
...
frontend/src/composables/useModelWhitelist.ts
View file @
1c0519f1
...
@@ -53,9 +53,11 @@ const geminiModels = [
...
@@ -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 = [
...
@@ -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
...
@@ -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 = [
...
@@ -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
'
},
// 精确映射
// 精确映射
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment