feat(models): add Gemini 3.8 Flash tiers to Antigravity and AGY catalogs

This commit is contained in:
Tuan Dinh
2026-09-11 13:56:38 +07:00
parent cde49c9372
commit fdc4b59d34
7 changed files with 101 additions and 3 deletions

View File

@@ -15,6 +15,10 @@ export const ANTIGRAVITY_MODEL_ALIASES = Object.freeze({
"gemini-3.7-flash-high": "gemini-3.7-flash-tiered",
"gemini-3.7-flash-medium": "gemini-3.7-flash-tiered",
"gemini-3.7-flash-low": "gemini-3.7-flash-tiered",
"gemini-3.8-flash": "gemini-3.8-flash-tiered",
"gemini-3.8-flash-high": "gemini-3.8-flash-tiered",
"gemini-3.8-flash-medium": "gemini-3.8-flash-tiered",
"gemini-3.8-flash-low": "gemini-3.8-flash-tiered",
"gpt-oss-120b": "gpt-oss-120b-medium",
// gemini-3.1-pro-low is not aliased: the upstream accepts it verbatim.
// gemini-3.1-pro-high: the discovery slot returns HTTP 400 on v1internal;

View File

@@ -43,6 +43,43 @@ export const ANTIGRAVITY_SHARED_MODELS = Object.freeze([
supportsVision: true,
toolCalling: true,
},
// Gemini 3.8 Flash tiers.
{
id: "gemini-3.8-flash-high",
name: "Gemini 3.8 Flash (High)",
contextLength: 1048576,
maxOutputTokens: 65536,
supportsReasoning: true,
supportsVision: true,
toolCalling: true,
},
{
id: "gemini-3.8-flash-medium",
name: "Gemini 3.8 Flash (Medium)",
contextLength: 1048576,
maxOutputTokens: 65536,
supportsReasoning: true,
supportsVision: true,
toolCalling: true,
},
{
id: "gemini-3.8-flash-low",
name: "Gemini 3.8 Flash (Low)",
contextLength: 1048576,
maxOutputTokens: 65536,
supportsReasoning: true,
supportsVision: true,
toolCalling: true,
},
{
id: "gemini-3.8-flash-tiered",
name: "Gemini 3.8 Flash (Tiered)",
contextLength: 1048576,
maxOutputTokens: 65536,
supportsReasoning: true,
supportsVision: true,
toolCalling: true,
},
// Gemini 3.1 Pro budget tiers. Live streamGenerateContent validation uses
// `gemini-pro-agent` for High; the separately advertised `gemini-3.1-pro-high`
// discovery slot currently returns HTTP 400 and is intentionally not public.

View File

@@ -400,7 +400,7 @@ export async function importManagedModels({
// table already knows only has a safe "-tiered" target to always resolve there,
// regardless of what any single connection's discovery reported.
for (const [displayId, safeTarget] of Object.entries(ANTIGRAVITY_MODEL_ALIASES)) {
if (safeTarget === "gemini-3.7-flash-tiered") {
if (safeTarget === "gemini-3.7-flash-tiered" || safeTarget === "gemini-3.8-flash-tiered") {
mappings[displayId] = `antigravity/${safeTarget}`;
}
}

View File

@@ -283,6 +283,53 @@ export const MODEL_SPECS: Record<string, ModelSpec> = {
supportsTools: true,
supportsVision: true,
},
// ── Gemini 3.8 Flash (current Antigravity/AGY live tiers) ─────────
"gemini-3.8-flash-high": {
maxOutputTokens: 65536,
contextWindow: 1048576,
defaultThinkingBudget: 24576,
thinkingBudgetCap: 24576,
supportsThinking: true,
supportsTools: true,
supportsVision: true,
},
"gemini-3.8-flash-medium": {
maxOutputTokens: 65536,
contextWindow: 1048576,
defaultThinkingBudget: 8192,
thinkingBudgetCap: 24576,
supportsThinking: true,
supportsTools: true,
supportsVision: true,
},
"gemini-3.8-flash-low": {
maxOutputTokens: 65536,
contextWindow: 1048576,
defaultThinkingBudget: 1024,
thinkingBudgetCap: 24576,
supportsThinking: true,
supportsTools: true,
supportsVision: true,
},
"gemini-3.8-flash": {
maxOutputTokens: 65536,
contextWindow: 1048576,
defaultThinkingBudget: 8192,
thinkingBudgetCap: 24576,
supportsThinking: true,
supportsTools: true,
supportsVision: true,
aliases: ["gemini-3.8-flash-tiered"],
},
"gemini-3.8-flash-tiered": {
maxOutputTokens: 65536,
contextWindow: 1048576,
defaultThinkingBudget: 8192,
thinkingBudgetCap: 24576,
supportsThinking: true,
supportsTools: true,
supportsVision: true,
},
// Provider-neutral compatibility for providers that still serve Gemini 3.6.
// Antigravity/AGY availability is governed by their own provider catalogs and

View File

@@ -18,9 +18,10 @@ test("(#3696) non-tiered ANTIGRAVITY_PUBLIC_MODELS entries resolve to distinct u
const seen = new Map<string, string>();
const collisions: string[] = [];
for (const model of ANTIGRAVITY_PUBLIC_MODELS) {
// Gemini 3.7 Flash tiers intentionally share the upstream `gemini-3.7-flash-tiered`
// Gemini 3.7 and 3.8 Flash tiers intentionally share their upstream `*-tiered`
// endpoint with different reasoning token budgets.
if (model.id.startsWith("gemini-3.7-flash")) continue;
if (model.id.startsWith("gemini-3.7-flash") || model.id.startsWith("gemini-3.8-flash"))
continue;
const upstream = resolveAntigravityModelId(model.id);
if (seen.has(upstream)) {
collisions.push(`${model.id} and ${seen.get(upstream)} both resolve to "${upstream}"`);

View File

@@ -62,6 +62,11 @@ test("resolveAntigravityModelId maps the documented Antigravity aliases to upstr
}
assert.equal(resolveAntigravityModelId("gemini-3.7-flash"), "gemini-3.7-flash-tiered");
assert.equal(resolveAntigravityModelId("gemini-3.7-flash-tiered"), "gemini-3.7-flash-tiered");
assert.equal(resolveAntigravityModelId("gemini-3.8-flash"), "gemini-3.8-flash-tiered");
assert.equal(resolveAntigravityModelId("gemini-3.8-flash-high"), "gemini-3.8-flash-tiered");
assert.equal(resolveAntigravityModelId("gemini-3.8-flash-medium"), "gemini-3.8-flash-tiered");
assert.equal(resolveAntigravityModelId("gemini-3.8-flash-low"), "gemini-3.8-flash-tiered");
assert.equal(resolveAntigravityModelId("gemini-3.8-flash-tiered"), "gemini-3.8-flash-tiered");
assert.equal(resolveAntigravityModelId("gpt-oss-120b"), "gpt-oss-120b-medium");
assert.equal(resolveAntigravityModelId("gemini-claude-sonnet-4-5"), "claude-sonnet-4-6");
assert.equal(resolveAntigravityModelId("gemini-claude-sonnet-4-5-thinking"), "claude-sonnet-4-6");

View File

@@ -36,6 +36,10 @@ const EXPECTED_LEADING_MODEL_ORDER = [
"gemini-3.7-flash-medium",
"gemini-3.7-flash-low",
"gemini-3.7-flash-tiered",
"gemini-3.8-flash-high",
"gemini-3.8-flash-medium",
"gemini-3.8-flash-low",
"gemini-3.8-flash-tiered",
"gemini-pro-agent",
"gemini-3.1-pro-low",
"gemini-3.1-flash-lite",