From fbd30dc4ee6de37c4f9d90abd0ac7b0896765254 Mon Sep 17 00:00:00 2001 From: Chris Staley Date: Tue, 31 Mar 2026 14:12:51 -0600 Subject: [PATCH] fix: update Antigravity model list and replace ag/ prefix with antigravity/ - Replace stale model IDs (gemini-3.1-pro-preview, gemini-3.1-flash-lite-preview) with correct High/Low tier variants from fetchAvailableModels API (gemini-3-pro-high, gemini-3-pro-low, gemini-3.1-pro-high, gemini-3.1-pro-low, etc.) - Remove ag/ alias prefix in favor of antigravity/ across registry, providers, model capabilities, combos, docs, and static model providers - Make provider alias optional in Zod schema and guard ALIAS_TO_ID/ID_TO_ALIAS maps - Show raw model IDs in quota display instead of unmapped display names - Update T28 model catalog test to assert new High/Low tier models --- open-sse/config/providerRegistry.ts | 15 +++++++++------ open-sse/services/modelCapabilities.ts | 3 --- src/app/(dashboard)/dashboard/combos/page.tsx | 6 +++--- .../usage/components/ProviderLimits/utils.tsx | 4 ++-- src/app/api/providers/[id]/models/route.ts | 11 +++++++++-- src/app/docs/page.tsx | 2 +- src/shared/constants/providers.ts | 6 +++--- src/shared/validation/providerSchema.ts | 2 +- tests/unit/t28-model-catalog-updates.test.mjs | 9 ++++++--- 9 files changed, 34 insertions(+), 24 deletions(-) diff --git a/open-sse/config/providerRegistry.ts b/open-sse/config/providerRegistry.ts index 9afef5ca2a..7fc272baab 100644 --- a/open-sse/config/providerRegistry.ts +++ b/open-sse/config/providerRegistry.ts @@ -46,7 +46,7 @@ export interface RegistryOAuth { export interface RegistryEntry { id: string; - alias: string; + alias?: string; format: string; executor: string; baseUrl?: string; @@ -359,7 +359,7 @@ export const REGISTRY: Record = { antigravity: { id: "antigravity", - alias: "ag", + alias: undefined, format: "antigravity", executor: "antigravity", baseUrls: [ @@ -389,14 +389,17 @@ export const REGISTRY: Record = { { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5" }, { id: "claude-sonnet-4", name: "Claude Sonnet 4" }, - { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview" }, - { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview" }, + { id: "gemini-3.1-pro-high", name: "Gemini 3.1 Pro (High)" }, + { id: "gemini-3.1-pro-low", name: "Gemini 3.1 Pro (Low)" }, + { id: "gemini-3.1-flash-image", name: "Gemini 3.1 Flash Image" }, + { id: "gemini-3-pro-high", name: "Gemini 3 Pro (High)" }, + { id: "gemini-3-pro-low", name: "Gemini 3 Pro (Low)" }, + { id: "gemini-3-flash", name: "Gemini 3 Flash" }, { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro" }, { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" }, + { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite" }, { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash" }, { id: "gpt-oss-120b-medium", name: "GPT OSS 120B Medium" }, - { id: "gpt-5", name: "GPT 5" }, - { id: "gpt-5-mini", name: "GPT 5 Mini" }, ], passthroughModels: true, }, diff --git a/open-sse/services/modelCapabilities.ts b/open-sse/services/modelCapabilities.ts index 7cd47e232f..5f72678d38 100644 --- a/open-sse/services/modelCapabilities.ts +++ b/open-sse/services/modelCapabilities.ts @@ -51,9 +51,6 @@ const REASONING_UNSUPPORTED_PATTERNS = [ "antigravity/claude-sonnet-4-6", "antigravity/claude-sonnet-4-5", "antigravity/claude-sonnet-4", - "ag/claude-sonnet-4-6", - "ag/claude-sonnet-4-5", - "ag/claude-sonnet-4", ]; function getRegistryReasoningFlag(providerIdOrAlias: string, modelId: string): boolean | null { diff --git a/src/app/(dashboard)/dashboard/combos/page.tsx b/src/app/(dashboard)/dashboard/combos/page.tsx index 181cded1fb..3c3845ba63 100644 --- a/src/app/(dashboard)/dashboard/combos/page.tsx +++ b/src/app/(dashboard)/dashboard/combos/page.tsx @@ -1450,10 +1450,10 @@ function ComboFormModal({ isOpen, combo, onClose, onSave, activeProviders }) { const PAID_PREMIUM_PRESET_MODELS = [ { model: "cu/claude-4.6-opus-high", weight: 0 }, - { model: "ag/claude-sonnet-4-6", weight: 0 }, + { model: "antigravity/claude-sonnet-4-6", weight: 0 }, { model: "cu/claude-4.6-sonnet-high", weight: 0 }, - { model: "ag/gpt-5", weight: 0 }, - { model: "ag/gemini-3.1-pro-preview", weight: 0 }, + { model: "antigravity/gemini-3.1-pro-high", weight: 0 }, + { model: "antigravity/gemini-3-pro-high", weight: 0 }, ]; const applyTemplate = (template) => { diff --git a/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.tsx b/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.tsx index b01a36514b..8bf11c95d4 100644 --- a/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.tsx +++ b/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.tsx @@ -204,8 +204,8 @@ export function parseQuotaData(provider, data) { if (data.quotas) { Object.entries(data.quotas).forEach(([modelKey, quota]: [string, any]) => { normalizedQuotas.push( - normalizeQuotaEntry(quota.displayName || modelKey, quota, { - modelKey: modelKey, // Keep modelKey for sorting + normalizeQuotaEntry(modelKey, quota, { + modelKey: modelKey, }) ); }); diff --git a/src/app/api/providers/[id]/models/route.ts b/src/app/api/providers/[id]/models/route.ts index d7e80d59a1..e16be03da0 100644 --- a/src/app/api/providers/[id]/models/route.ts +++ b/src/app/api/providers/[id]/models/route.ts @@ -69,10 +69,17 @@ const STATIC_MODEL_PROVIDERS: Record Array<{ id: string; name: str antigravity: () => [ { id: "claude-opus-4-6-thinking", name: "Claude Opus 4.6 Thinking" }, { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, - { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview" }, - { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview" }, + { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5" }, + { id: "claude-sonnet-4", name: "Claude Sonnet 4" }, + { id: "gemini-3.1-pro-high", name: "Gemini 3.1 Pro (High)" }, + { id: "gemini-3.1-pro-low", name: "Gemini 3.1 Pro (Low)" }, + { id: "gemini-3.1-flash-image", name: "Gemini 3.1 Flash Image" }, + { id: "gemini-3-pro-high", name: "Gemini 3 Pro (High)" }, + { id: "gemini-3-pro-low", name: "Gemini 3 Pro (Low)" }, + { id: "gemini-3-flash", name: "Gemini 3 Flash" }, { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro" }, { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" }, + { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite" }, { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash" }, { id: "gpt-oss-120b-medium", name: "GPT OSS 120B Medium" }, ], diff --git a/src/app/docs/page.tsx b/src/app/docs/page.tsx index 1895f1c35f..77bd26e631 100644 --- a/src/app/docs/page.tsx +++ b/src/app/docs/page.tsx @@ -394,7 +394,7 @@ export default function DocsPage() { {t("clientClaudeBullet1Prefix")}{" "} cc/{" "} {t("clientClaudeBullet1Middle")}{" "} - ag/{" "} + antigravity/{" "} {t("clientClaudeBullet1Suffix")}
  • {t("oauthAutoRefresh")}
  • diff --git a/src/shared/constants/providers.ts b/src/shared/constants/providers.ts index 6f81b77246..e448b40bbf 100644 --- a/src/shared/constants/providers.ts +++ b/src/shared/constants/providers.ts @@ -22,7 +22,7 @@ export const OAUTH_PROVIDERS = { claude: { id: "claude", alias: "cc", name: "Claude Code", icon: "smart_toy", color: "#D97757" }, antigravity: { id: "antigravity", - alias: "ag", + alias: undefined, name: "Antigravity", icon: "rocket_launch", color: "#F59E0B", @@ -643,13 +643,13 @@ export function getProviderAlias(providerId) { // Alias to ID mapping (for quick lookup) export const ALIAS_TO_ID = Object.values(AI_PROVIDERS).reduce((acc, p) => { - acc[p.alias] = p.id; + if (p.alias) acc[p.alias] = p.id; return acc; }, {}); // ID to Alias mapping export const ID_TO_ALIAS = Object.values(AI_PROVIDERS).reduce((acc, p) => { - acc[p.id] = p.alias; + acc[p.id] = p.alias || p.id; return acc; }, {}); diff --git a/src/shared/validation/providerSchema.ts b/src/shared/validation/providerSchema.ts index 4bc5b1e219..0ca395d312 100644 --- a/src/shared/validation/providerSchema.ts +++ b/src/shared/validation/providerSchema.ts @@ -12,7 +12,7 @@ import { z } from "zod"; export const ProviderSchema = z.object({ id: z.string().min(1), - alias: z.string().min(1), + alias: z.string().min(1).optional(), name: z.string().min(1), icon: z.string().min(1), color: z.string().regex(/^#[0-9A-Fa-f]{6}$/, "Must be a valid hex color (#RRGGBB)"), diff --git a/tests/unit/t28-model-catalog-updates.test.mjs b/tests/unit/t28-model-catalog-updates.test.mjs index 67750d0a0e..00e6f85088 100644 --- a/tests/unit/t28-model-catalog-updates.test.mjs +++ b/tests/unit/t28-model-catalog-updates.test.mjs @@ -15,11 +15,14 @@ test("T28: gemini catalog includes preview models from 9router", () => { assert.ok(geminiCliIds.includes("gemini-3-flash-preview")); }); -test("T28: antigravity static catalog includes Gemini 3.1 preview fallbacks", () => { +test("T28: antigravity static catalog includes Gemini 3 Pro High/Low tier models", () => { const staticIds = (getStaticModelsForProvider("antigravity") || []).map((m) => m.id); - assert.ok(staticIds.includes("gemini-3.1-pro-preview")); - assert.ok(staticIds.includes("gemini-3.1-flash-lite-preview")); + assert.ok(staticIds.includes("gemini-3.1-pro-high")); + assert.ok(staticIds.includes("gemini-3.1-pro-low")); + assert.ok(staticIds.includes("gemini-3-pro-high")); + assert.ok(staticIds.includes("gemini-3-pro-low")); + assert.ok(staticIds.includes("gemini-3-flash")); }); test("T28: qwen registry uses native chat.qwen.ai base URL", () => {