diff --git a/database/model_pricing_override.go b/database/model_pricing_override.go index f86d8b455..142adda8d 100644 --- a/database/model_pricing_override.go +++ b/database/model_pricing_override.go @@ -329,7 +329,7 @@ func antigravityCanonicalPricingModel(model string) string { } lower := strings.ToLower(strings.TrimSpace(normalized)) if strings.HasPrefix(lower, "gemini-") { - for _, suffix := range []string{"-high", "-medium", "-low", "-tiered"} { + for _, suffix := range []string{"-xhigh", "-high", "-medium", "-low", "-tiered"} { if strings.HasSuffix(lower, suffix) { return strings.TrimSuffix(lower, suffix) } diff --git a/database/model_pricing_override_test.go b/database/model_pricing_override_test.go index b192bf37d..cc93247be 100644 --- a/database/model_pricing_override_test.go +++ b/database/model_pricing_override_test.go @@ -131,6 +131,7 @@ func TestPricingManagementModelKeyPreservesIndependentAlias(t *testing.T) { {model: "gemini-3.8-flash-low", want: "gemini-3.8-flash-low"}, {model: "gemini-3.8-flash-medium", want: "gemini-3.8-flash-medium"}, {model: "gemini-3.8-flash", want: "gemini-3.8-flash"}, + {model: "gemini-4-hydrogen-xhigh", want: "gemini-4-hydrogen-xhigh"}, {model: "claude-opus-4-6-thinking", want: "claude-opus-4-6-thinking"}, {model: "claude-opus-5-5-high", want: "claude-opus-5-5-high"}, } @@ -149,6 +150,9 @@ func TestAntigravityPricingAliasInheritance(t *testing.T) { if target := PricingAliasTarget("gemini-3.8-flash-high"); target != "gemini-3.8-flash" { t.Fatalf("PricingAliasTarget(gemini-3.8-flash-high) = %q, want gemini-3.8-flash", target) } + if target := PricingAliasTarget("gemini-4-hydrogen-xhigh"); target != "gemini-4-hydrogen" { + t.Fatalf("PricingAliasTarget(gemini-4-hydrogen-xhigh) = %q, want gemini-4-hydrogen", target) + } if target := PricingAliasTarget("claude-opus-4-6-thinking"); target != "claude-opus-4-6" { t.Fatalf("PricingAliasTarget(claude-opus-4-6-thinking) = %q, want claude-opus-4-6", target) } @@ -162,7 +166,7 @@ func TestAntigravityPricingAliasInheritance(t *testing.T) { t.Fatalf("gemini-3.8-flash-high default source = %q, want default", source) } - // 2. 模拟同步源写入 gemini-3.8-flash 覆盖:变体应自动继承 + // 2. 模拟同步源写入 gemini-3.8-flash 与 gemini-4-hydrogen 覆盖:变体应自动继承 syncedOverrides := map[string]ModelPricingOverride{ "gemini-3.8-flash": { Source: ModelPricingSourceSynced, @@ -170,6 +174,12 @@ func TestAntigravityPricingAliasInheritance(t *testing.T) { Output: 4.00, CachedInput: 0.08, }, + "gemini-4-hydrogen": { + Source: ModelPricingSourceSynced, + Input: 1.50, + Output: 7.50, + CachedInput: 0.075, + }, } SetModelPricingOverrides(syncedOverrides) @@ -181,6 +191,14 @@ func TestAntigravityPricingAliasInheritance(t *testing.T) { t.Fatalf("gemini-3.8-flash-high source = %q, want synced", source) } + hydrogenSynced := GetModelPricing("gemini-4-hydrogen-xhigh") + if hydrogenSynced.InputPricePerMToken != 1.50 || hydrogenSynced.OutputPricePerMToken != 7.50 || hydrogenSynced.CacheReadPricePerMToken != 0.075 { + t.Fatalf("gemini-4-hydrogen-xhigh should inherit synced base price: %+v", hydrogenSynced) + } + if source := ModelPricingSourceFor("gemini-4-hydrogen-xhigh"); source != ModelPricingSourceSynced { + t.Fatalf("gemini-4-hydrogen-xhigh source = %q, want synced", source) + } + // 3. 管理员显式为 high 档设置自定义价格:优先命中 alias custom syncedOverrides["gemini-3.8-flash-high"] = ModelPricingOverride{ Source: ModelPricingSourceCustom,