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
This commit is contained in:
Chris Staley
2026-03-31 14:12:51 -06:00
parent fb9f72fc90
commit fbd30dc4ee
9 changed files with 34 additions and 24 deletions

View File

@@ -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<string, RegistryEntry> = {
antigravity: {
id: "antigravity",
alias: "ag",
alias: undefined,
format: "antigravity",
executor: "antigravity",
baseUrls: [
@@ -389,14 +389,17 @@ export const REGISTRY: Record<string, RegistryEntry> = {
{ 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,
},

View File

@@ -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 {

View File

@@ -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) => {

View File

@@ -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,
})
);
});

View File

@@ -69,10 +69,17 @@ const STATIC_MODEL_PROVIDERS: Record<string, () => 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" },
],

View File

@@ -394,7 +394,7 @@ export default function DocsPage() {
{t("clientClaudeBullet1Prefix")}{" "}
<code className="px-1 rounded bg-bg-subtle">cc/</code>{" "}
{t("clientClaudeBullet1Middle")}{" "}
<code className="px-1 rounded bg-bg-subtle">ag/</code>{" "}
<code className="px-1 rounded bg-bg-subtle">antigravity/</code>{" "}
{t("clientClaudeBullet1Suffix")}
</li>
<li>{t("oauthAutoRefresh")}</li>

View File

@@ -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;
}, {});

View File

@@ -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)"),

View File

@@ -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", () => {