Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 67 additions & 2 deletions open-sse/config/antigravityModelAliases.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,27 @@
export const ANTIGRAVITY_PUBLIC_MODELS = Object.freeze([
// Claude (Antigravity backend). The `agy` provider already ships these from the live
// :fetchAvailableModels probe (see agyModels.ts) and discussion #3184 confirmed they
// are user-callable through the `antigravity` OAuth provider too — same backend.
// `antigravity/claude-opus-4-6-thinking` and `antigravity/claude-sonnet-4-6` both work.
// They are upstream IDs, so no alias remapping is required.
{
id: "claude-opus-4-6-thinking",
name: "Claude Opus 4.6 (Thinking)",
contextLength: 200000,
maxOutputTokens: 65536,
supportsReasoning: true,
supportsVision: true,
toolCalling: true,
},
{
id: "claude-sonnet-4-6",
name: "Claude Sonnet 4.6 (Thinking)",
contextLength: 200000,
maxOutputTokens: 65536,
supportsReasoning: true,
supportsVision: true,
toolCalling: true,
},
// Gemini 3.5 Flash — flagship model in Antigravity 2.0 (May 2026)
{
id: "gemini-3.5-flash-preview",
Expand Down Expand Up @@ -27,6 +50,27 @@ export const ANTIGRAVITY_PUBLIC_MODELS = Object.freeze([
supportsVision: true,
toolCalling: true,
},
// Gemini 3.1 Pro budget tiers — agy already ships these; #3184 confirmed they work via
// the antigravity OAuth provider. The -high/-low suffix is aliased to the plain
// gemini-3.1-pro upstream id (see ANTIGRAVITY_MODEL_ALIASES / #3229).
{
id: "gemini-3.1-pro-high",
name: "Gemini 3.1 Pro (High)",
contextLength: 1048576,
maxOutputTokens: 65535,
supportsReasoning: true,
supportsVision: true,
toolCalling: true,
},
{
id: "gemini-3.1-pro-low",
name: "Gemini 3.1 Pro (Low)",
contextLength: 1048576,
maxOutputTokens: 65535,
supportsReasoning: true,
supportsVision: true,
toolCalling: true,
},
{
id: "gemini-3-flash-preview",
name: "Gemini 3 Flash",
Expand All @@ -36,6 +80,24 @@ export const ANTIGRAVITY_PUBLIC_MODELS = Object.freeze([
supportsVision: true,
toolCalling: true,
},
// Gemini 3.5 Flash budget tiers — agy ships these as exact upstream ids; #3184 verified
// they work via the antigravity OAuth provider (no alias remapping required).
{
id: "gemini-3.5-flash-low",
name: "Gemini 3.5 Flash (Low)",
contextLength: 1048576,
maxOutputTokens: 65536,
supportsVision: true,
toolCalling: true,
},
{
id: "gemini-3.5-flash-extra-low",
name: "Gemini 3.5 Flash (Extra Low)",
contextLength: 1048576,
maxOutputTokens: 65536,
supportsVision: true,
toolCalling: true,
},
Comment on lines +85 to +100

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The budget tiers gemini-3.5-flash-low and gemini-3.5-flash-extra-low are missing the supportsReasoning: true capability flag. Since they are budget tiers of the Gemini 3.5 Flash model (which natively supports reasoning, as configured on gemini-3.5-flash-preview), they should also have this flag enabled to ensure feature parity and correct client-side behavior.

  {
    id: "gemini-3.5-flash-low",
    name: "Gemini 3.5 Flash (Low)",
    contextLength: 1048576,
    maxOutputTokens: 65536,
    supportsReasoning: true,
    supportsVision: true,
    toolCalling: true,
  },
  {
    id: "gemini-3.5-flash-extra-low",
    name: "Gemini 3.5 Flash (Extra Low)",
    contextLength: 1048576,
    maxOutputTokens: 65536,
    supportsReasoning: true,
    supportsVision: true,
    toolCalling: true,
  },

{
id: "gemini-3.1-flash-lite",
name: "Gemini 3.1 Flash Lite",
Expand Down Expand Up @@ -111,8 +173,11 @@ export const ANTIGRAVITY_MODEL_ALIASES = Object.freeze({
"gemini-3-flash-preview": "gemini-3-flash",
"gemini-3-pro-image-preview": "gemini-3-pro-image",
"gemini-2.5-computer-use-preview-10-2025": "rev19-uic3-1p",
// Deprecated: Claude models were removed from Antigravity 2.0 (May 2026).
// These aliases are kept for backward compatibility but will 404 on new requests.
// Legacy Claude display ids → current upstream ids. NOTE: an earlier comment here
// assumed Claude was removed from Antigravity 2.0 and would 404; discussion #3184
// disproved that — the Antigravity OAuth backend still serves claude-opus-4-6-thinking
// and claude-sonnet-4-6 (now listed in ANTIGRAVITY_PUBLIC_MODELS above). These aliases
// remap the old gemini-claude-* ids to the live upstream ids.
"gemini-claude-sonnet-4-5": "claude-sonnet-4-6",
"gemini-claude-sonnet-4-5-thinking": "claude-sonnet-4-6",
"gemini-claude-opus-4-5-thinking": "claude-opus-4-6-thinking",
Expand Down
27 changes: 21 additions & 6 deletions tests/unit/antigravity-model-aliases.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,17 +53,32 @@ test("isUserCallableAntigravityModelId only allows public chat-capable model IDs
assert.equal(isUserCallableAntigravityModelId("gemini-2.5-flash-lite"), true);
assert.equal(isUserCallableAntigravityModelId("gemini-2.5-flash-thinking"), true);
assert.equal(isUserCallableAntigravityModelId("gemini-pro-agent"), true);
// Claude was removed from Antigravity 2.0's public catalog (May 2026); the alias is
// kept for back-compat but the model is no longer user-callable.
assert.equal(isUserCallableAntigravityModelId("claude-sonnet-4-6"), false);
// #3184: Claude IS user-callable through the Antigravity OAuth provider (same backend as
// `agy`, verified empirically). An earlier assumption that it was removed in Antigravity
// 2.0 was wrong.
assert.equal(isUserCallableAntigravityModelId("claude-opus-4-6-thinking"), true);
assert.equal(isUserCallableAntigravityModelId("claude-sonnet-4-6"), true);
// #3184: Gemini budget tiers now exposed (agy parity).
assert.equal(isUserCallableAntigravityModelId("gemini-3.1-pro-high"), true);
assert.equal(isUserCallableAntigravityModelId("gemini-3.1-pro-low"), true);
assert.equal(isUserCallableAntigravityModelId("gemini-3.5-flash-low"), true);
assert.equal(isUserCallableAntigravityModelId("gemini-3.5-flash-extra-low"), true);
assert.equal(isUserCallableAntigravityModelId("tab_flash_lite_preview"), false);
assert.equal(isUserCallableAntigravityModelId("unknown-model"), false);
});

test("ANTIGRAVITY_PUBLIC_MODELS exposes captured Antigravity 2.0.1 names and capabilities", () => {
// Claude models were removed from Antigravity 2.0's public catalog (May 2026), so they
// are no longer exposed as public models (the back-compat alias still resolves upstream).
assert.equal(getPublicModel("claude-opus-4-6-thinking"), undefined);
// #3184: Claude is exposed in the antigravity catalog (same backend as `agy`, verified).
assert.deepEqual(getPublicModel("claude-opus-4-6-thinking"), {
id: "claude-opus-4-6-thinking",
name: "Claude Opus 4.6 (Thinking)",
contextLength: 200000,
maxOutputTokens: 65536,
supportsReasoning: true,
supportsVision: true,
toolCalling: true,
});
assert.equal(getPublicModel("claude-sonnet-4-6").name, "Claude Sonnet 4.6 (Thinking)");
assert.deepEqual(getPublicModel("gemini-3.5-flash-preview"), {
id: "gemini-3.5-flash-preview",
name: "Gemini 3.5 Flash",
Expand Down
7 changes: 5 additions & 2 deletions tests/unit/usage-service-hardening.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -340,10 +340,13 @@ test("usage service covers Antigravity quota parsing, exclusions and forbidden a
});

assert.equal(usage.plan, "Ultra");
// claude-sonnet-4-6 was removed from ANTIGRAVITY_PUBLIC_MODELS in May 2026 (deprecated)
assert.deepEqual(Object.keys(usage.quotas).sort(), ["gemini-pro-agent"]);
// #3184: claude-sonnet-4-6 is user-callable on the Antigravity backend, so its quota is
// surfaced. tab_flash_lite_preview (not chat-callable), gemini-unlimited (no quota), and
// internal-model (internal) are still filtered out by the hardening logic.
assert.deepEqual(Object.keys(usage.quotas).sort(), ["claude-sonnet-4-6", "gemini-pro-agent"]);
assert.equal(usage.quotas["gemini-pro-agent"].total, 0);
assert.equal(usage.quotas["gemini-pro-agent"].remainingPercentage, 100);
assert.equal(usage.quotas["claude-sonnet-4-6"].remainingPercentage, 40);
const loadCodeAssistCall = calls.find((call) => call.url.includes("loadCodeAssist"));
assert.match(loadCodeAssistCall?.url, /daily-cloudcode-pa\.sandbox\.googleapis\.com/);
assert.match(loadCodeAssistCall?.init.headers["User-Agent"], /^vscode\/1\.X\.X \(Antigravity\//);
Expand Down