Skip to content
Open
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
26 changes: 5 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,7 @@ opencode run "Hello" --model=google/antigravity-claude-opus-4-6-thinking --varia

| Model | Variants | Notes |
|-------|----------|-------|
| `antigravity-gemini-3-pro` | low, high | Gemini 3 Pro with thinking |
| `antigravity-gemini-3.1-pro` | low, high | Gemini 3.1 Pro with thinking (rollout-dependent) |
| `antigravity-gemini-3.1-pro` | low, high | Gemini 3.1 Pro with thinking |
| `antigravity-gemini-3-flash` | minimal, low, medium, high | Gemini 3 Flash with thinking |
| `antigravity-claude-sonnet-4-6` | — | Claude Sonnet 4.6 |
| `antigravity-claude-opus-4-6-thinking` | low, max | Claude Opus 4.6 with extended thinking |
Expand All @@ -125,9 +124,8 @@ opencode run "Hello" --model=google/antigravity-claude-opus-4-6-thinking --varia
| `gemini-2.5-flash` | Gemini 2.5 Flash |
| `gemini-2.5-pro` | Gemini 2.5 Pro |
| `gemini-3-flash-preview` | Gemini 3 Flash (preview) |
| `gemini-3-pro-preview` | Gemini 3 Pro (preview) |
| `gemini-3.1-pro-preview` | Gemini 3.1 Pro (preview, rollout-dependent) |
| `gemini-3.1-pro-preview-customtools` | Gemini 3.1 Pro Preview Custom Tools (preview, rollout-dependent) |
| `gemini-3.1-pro-preview` | Gemini 3.1 Pro (preview) |
| `gemini-3.1-pro-preview-customtools` | Gemini 3.1 Pro Preview Custom Tools (preview) |

> **Routing Behavior:**
> - **Antigravity-first (default):** Gemini models use Antigravity quota across accounts.
Expand Down Expand Up @@ -155,15 +153,6 @@ Add this to your `~/.config/opencode/opencode.json`:
"provider": {
"google": {
"models": {
"antigravity-gemini-3-pro": {
"name": "Gemini 3 Pro (Antigravity)",
"limit": { "context": 1048576, "output": 65535 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
"variants": {
"low": { "thinkingLevel": "low" },
"high": { "thinkingLevel": "high" }
}
},
"antigravity-gemini-3.1-pro": {
"name": "Gemini 3.1 Pro (Antigravity)",
"limit": { "context": 1048576, "output": 65535 },
Expand Down Expand Up @@ -213,11 +202,6 @@ Add this to your `~/.config/opencode/opencode.json`:
"limit": { "context": 1048576, "output": 65536 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
},
"gemini-3-pro-preview": {
"name": "Gemini 3 Pro Preview (Gemini CLI)",
"limit": { "context": 1048576, "output": 65535 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
},
"gemini-3.1-pro-preview": {
"name": "Gemini 3.1 Pro Preview (Gemini CLI)",
"limit": { "context": 1048576, "output": 65535 },
Expand Down Expand Up @@ -422,7 +406,7 @@ If you encounter errors during a session:
{
"google_auth": false,
"agents": {
"frontend-ui-ux-engineer": { "model": "google/antigravity-gemini-3-pro" },
"frontend-ui-ux-engineer": { "model": "google/antigravity-gemini-3.1-pro" },
"document-writer": { "model": "google/antigravity-gemini-3-flash" }
}
}
Expand Down Expand Up @@ -560,7 +544,7 @@ Disable built-in auth and override agent models in `oh-my-opencode.json`:
{
"google_auth": false,
"agents": {
"frontend-ui-ux-engineer": { "model": "google/antigravity-gemini-3-pro" },
"frontend-ui-ux-engineer": { "model": "google/antigravity-gemini-3.1-pro" },
"document-writer": { "model": "google/antigravity-gemini-3-flash" },
"multimodal-looker": { "model": "google/antigravity-gemini-3-flash" }
}
Expand Down
14 changes: 7 additions & 7 deletions src/plugin/config/models.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,16 @@ describe("OPENCODE_MODEL_DEFINITIONS", () => {
"antigravity-claude-opus-4-6-thinking",
"antigravity-claude-sonnet-4-6",
"antigravity-gemini-3-flash",
"antigravity-gemini-3-pro",
"antigravity-gemini-3.1-pro",
"gemini-2.5-flash",
"gemini-2.5-pro",
"gemini-3-flash-preview",
"gemini-3-pro-preview",
"gemini-3.1-pro-preview",
"gemini-3.1-pro-preview-customtools",
]);
});

it("defines Gemini 3 variants for Antigravity models", () => {
expect(getModel("antigravity-gemini-3-pro").variants).toEqual({
low: { thinkingLevel: "low" },
high: { thinkingLevel: "high" },
});

expect(getModel("antigravity-gemini-3.1-pro").variants).toEqual({
low: { thinkingLevel: "low" },
high: { thinkingLevel: "high" },
Expand All @@ -54,4 +47,11 @@ describe("OPENCODE_MODEL_DEFINITIONS", () => {
max: { thinkingConfig: { thinkingBudget: 32768 } },
});
});

it("does not expose stale unavailable model IDs", () => {
expect(OPENCODE_MODEL_DEFINITIONS["antigravity-gemini-3-pro"]).toBeUndefined();
expect(OPENCODE_MODEL_DEFINITIONS["gemini-3-pro-preview"]).toBeUndefined();
expect(Object.keys(OPENCODE_MODEL_DEFINITIONS).some((name) => name.includes("claude-sonnet-4-5"))).toBe(false);
expect(Object.keys(OPENCODE_MODEL_DEFINITIONS).some((name) => name.includes("claude-opus-4-5"))).toBe(false);
});
});
14 changes: 0 additions & 14 deletions src/plugin/config/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,6 @@ const DEFAULT_MODALITIES: ModelModalities = {
};

export const OPENCODE_MODEL_DEFINITIONS: OpencodeModelDefinitions = {
"antigravity-gemini-3-pro": {
name: "Gemini 3 Pro (Antigravity)",
limit: { context: 1048576, output: 65535 },
modalities: DEFAULT_MODALITIES,
variants: {
low: { thinkingLevel: "low" },
high: { thinkingLevel: "high" },
},
},
"antigravity-gemini-3.1-pro": {
name: "Gemini 3.1 Pro (Antigravity)",
limit: { context: 1048576, output: 65535 },
Expand Down Expand Up @@ -96,11 +87,6 @@ export const OPENCODE_MODEL_DEFINITIONS: OpencodeModelDefinitions = {
limit: { context: 1048576, output: 65536 },
modalities: DEFAULT_MODALITIES,
},
"gemini-3-pro-preview": {
name: "Gemini 3 Pro Preview (Gemini CLI)",
limit: { context: 1048576, output: 65535 },
modalities: DEFAULT_MODALITIES,
},
"gemini-3.1-pro-preview": {
name: "Gemini 3.1 Pro Preview (Gemini CLI)",
limit: { context: 1048576, output: 65535 },
Expand Down
5 changes: 3 additions & 2 deletions src/plugin/config/updater.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,9 @@ describe("updateOpencodeConfig", () => {
// Old model should be replaced
expect(writtenConfig.provider.google.models["old-model"]).toBeUndefined();
// New models should be present
expect(writtenConfig.provider.google.models["antigravity-gemini-3-pro"]).toBeDefined();
expect(writtenConfig.provider.google.models["antigravity-gemini-3.1-pro"]).toBeDefined();
expect(writtenConfig.provider.google.models["antigravity-claude-sonnet-4-6"]).toBeDefined();
expect(writtenConfig.provider.google.models["antigravity-gemini-3-pro"]).toBeUndefined();
});

test("preserves non-google provider sections", async () => {
Expand Down Expand Up @@ -235,7 +236,7 @@ describe("updateOpencodeConfig", () => {
expect(writtenConfig.plugin).toContain("other-plugin");
expect(writtenConfig.plugin).toContain("opencode-antigravity-auth@latest");
expect(writtenConfig.provider.google.region).toBe("us-central1");
expect(writtenConfig.provider.google.models["antigravity-gemini-3-pro"]).toBeDefined();
expect(writtenConfig.provider.google.models["antigravity-gemini-3.1-pro"]).toBeDefined();
});

test("prefers existing opencode.jsonc when using default config path", async () => {
Expand Down
8 changes: 4 additions & 4 deletions src/plugin/request.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1036,7 +1036,7 @@ it("removes x-api-key header", () => {
expect(result.effectiveModel).toBe("gemini-3-flash");
});

it("transforms gemini-3-pro-preview to gemini-3-pro-low for antigravity headerStyle", () => {
it("transforms legacy gemini-3-pro-preview to gemini-3.1-pro-low for antigravity headerStyle", () => {
const result = prepareAntigravityRequest(
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-preview:generateContent",
{ method: "POST", body: JSON.stringify({ contents: [] }) },
Expand All @@ -1045,7 +1045,7 @@ it("removes x-api-key header", () => {
undefined,
"antigravity"
);
expect(result.effectiveModel).toBe("gemini-3-pro-low");
expect(result.effectiveModel).toBe("gemini-3.1-pro-low");
});

it("transforms gemini-3.1-pro-preview to gemini-3.1-pro-low for antigravity headerStyle", () => {
Expand Down Expand Up @@ -1084,7 +1084,7 @@ it("removes x-api-key header", () => {
expect(result.effectiveModel).toBe("gemini-3-flash-preview");
});

it("transforms gemini-3-pro-low to gemini-3-pro-preview for gemini-cli headerStyle", () => {
it("transforms legacy gemini-3-pro-low to gemini-3.1-pro-preview for gemini-cli headerStyle", () => {
const result = prepareAntigravityRequest(
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-low:generateContent",
{ method: "POST", body: JSON.stringify({ contents: [] }) },
Expand All @@ -1093,7 +1093,7 @@ it("removes x-api-key header", () => {
undefined,
"gemini-cli"
);
expect(result.effectiveModel).toBe("gemini-3-pro-preview");
expect(result.effectiveModel).toBe("gemini-3.1-pro-preview");
});

it("transforms gemini-3.1-pro-low to gemini-3.1-pro-preview for gemini-cli headerStyle", () => {
Expand Down
67 changes: 55 additions & 12 deletions src/plugin/transform/model-resolver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ describe("resolveModelWithTier", () => {
});

describe("Gemini 3 preview models (Issue #115)", () => {
it("gemini-3-pro-preview gets default thinkingLevel 'low' with antigravity quota", () => {
it("gemini-3-pro-preview resolves to Gemini 3.1 Pro preview", () => {
const result = resolveModelWithTier("gemini-3-pro-preview");
expect(result.actualModel).toBe("gemini-3-pro-preview");
expect(result.actualModel).toBe("gemini-3.1-pro-preview");
expect(result.thinkingLevel).toBe("low");
// All Gemini models now default to antigravity
expect(result.quotaPreference).toBe("antigravity");
Expand Down Expand Up @@ -60,6 +60,43 @@ describe("resolveModelWithTier", () => {
});
});

describe("legacy model aliases", () => {
it("antigravity-gemini-3-pro resolves to Gemini 3.1 Pro low", () => {
const result = resolveModelWithTier("antigravity-gemini-3-pro");
expect(result.actualModel).toBe("gemini-3.1-pro-low");
expect(result.thinkingLevel).toBe("low");
expect(result.quotaPreference).toBe("antigravity");
});

it("antigravity-gemini-3-pro-high preserves the high tier on Gemini 3.1 Pro", () => {
const result = resolveModelWithTier("antigravity-gemini-3-pro-high");
expect(result.actualModel).toBe("gemini-3.1-pro-high");
expect(result.thinkingLevel).toBe("high");
expect(result.tier).toBe("high");
});

it("antigravity-claude-sonnet-4-5 resolves to Claude Sonnet 4.6", () => {
const result = resolveModelWithTier("antigravity-claude-sonnet-4-5");
expect(result.actualModel).toBe("claude-sonnet-4-6");
expect(result.isThinkingModel).toBe(false);
expect(result.quotaPreference).toBe("antigravity");
});

it("antigravity-claude-opus-4-5-thinking resolves to Claude Opus 4.6 Thinking", () => {
const result = resolveModelWithTier("antigravity-claude-opus-4-5-thinking");
expect(result.actualModel).toBe("claude-opus-4-6-thinking");
expect(result.thinkingBudget).toBe(32768);
expect(result.isThinkingModel).toBe(true);
});

it("claude-opus-4-5-thinking-low preserves the low tier on Claude Opus 4.6 Thinking", () => {
const result = resolveModelWithTier("claude-opus-4-5-thinking-low");
expect(result.actualModel).toBe("claude-opus-4-6-thinking");
expect(result.thinkingBudget).toBe(8192);
expect(result.tier).toBe("low");
});
});

describe("cli_first quota preference", () => {
it("prefers gemini-cli when cli_first is true and no prefix is set", () => {
const result = resolveModelWithTier("gemini-3-flash", { cli_first: true });
Expand Down Expand Up @@ -91,16 +128,16 @@ describe("resolveModelWithTier", () => {
});

describe("Antigravity Gemini 3 with tier suffix", () => {
it("antigravity-gemini-3-pro-low gets thinkingLevel from tier", () => {
it("legacy antigravity-gemini-3-pro-low resolves to Gemini 3.1 Pro low", () => {
const result = resolveModelWithTier("antigravity-gemini-3-pro-low");
expect(result.actualModel).toBe("gemini-3-pro-low");
expect(result.actualModel).toBe("gemini-3.1-pro-low");
expect(result.thinkingLevel).toBe("low");
expect(result.quotaPreference).toBe("antigravity");
});

it("antigravity-gemini-3-pro-high gets thinkingLevel from tier", () => {
it("legacy antigravity-gemini-3-pro-high resolves to Gemini 3.1 Pro high", () => {
const result = resolveModelWithTier("antigravity-gemini-3-pro-high");
expect(result.actualModel).toBe("gemini-3-pro-high");
expect(result.actualModel).toBe("gemini-3.1-pro-high");
expect(result.thinkingLevel).toBe("high");
expect(result.quotaPreference).toBe("antigravity");
});
Expand Down Expand Up @@ -184,7 +221,7 @@ describe("resolveModelWithVariant", () => {

it("falls back to tier resolution for Gemini 3 models", () => {
const result = resolveModelWithVariant("gemini-3-pro-high");
expect(result.actualModel).toBe("gemini-3-pro");
expect(result.actualModel).toBe("gemini-3.1-pro");
expect(result.thinkingLevel).toBe("high");
expect(result.configSource).toBeUndefined();
});
Expand All @@ -204,7 +241,7 @@ describe("resolveModelWithVariant", () => {
const result = resolveModelWithVariant("antigravity-gemini-3-pro", {
thinkingBudget: 8000,
});
expect(result.actualModel).toBe("gemini-3-pro-low");
expect(result.actualModel).toBe("gemini-3.1-pro-low");
expect(result.thinkingLevel).toBe("low");
expect(result.thinkingBudget).toBeUndefined();
expect(result.configSource).toBe("variant");
Expand Down Expand Up @@ -267,9 +304,9 @@ describe("Issue #103: resolveModelForHeaderStyle", () => {
expect(result.quotaPreference).toBe("antigravity");
});

it("transforms gemini-3-pro-preview to gemini-3-pro-low for antigravity", () => {
it("transforms legacy gemini-3-pro-preview to gemini-3.1-pro-low for antigravity", () => {
const result = resolveModelForHeaderStyle("gemini-3-pro-preview", "antigravity");
expect(result.actualModel).toBe("gemini-3-pro-low");
expect(result.actualModel).toBe("gemini-3.1-pro-low");
expect(result.quotaPreference).toBe("antigravity");
});

Expand All @@ -293,9 +330,15 @@ describe("Issue #103: resolveModelForHeaderStyle", () => {
expect(result.quotaPreference).toBe("gemini-cli");
});

it("transforms gemini-3-pro-low to gemini-3-pro-preview for gemini-cli", () => {
it("transforms legacy gemini-3-pro-low to gemini-3.1-pro-preview for gemini-cli", () => {
const result = resolveModelForHeaderStyle("gemini-3-pro-low", "gemini-cli");
expect(result.actualModel).toBe("gemini-3-pro-preview");
expect(result.actualModel).toBe("gemini-3.1-pro-preview");
expect(result.quotaPreference).toBe("gemini-cli");
});

it("transforms legacy gemini-3-pro-preview to gemini-3.1-pro-preview for gemini-cli", () => {
const result = resolveModelForHeaderStyle("gemini-3-pro-preview", "gemini-cli");
expect(result.actualModel).toBe("gemini-3.1-pro-preview");
expect(result.quotaPreference).toBe("gemini-cli");
});

Expand Down
Loading