The project's README from github.com/NoeFabris/opencode-antigravity-auth. As one markdown file: README.md.
Enable Opencode to authenticate against Antigravity (Google's IDE) via OAuth so you can use Antigravity rate limits and access models like gemini-3.1-pro and claude-opus-4-6-thinking with your Google credentials.
[!CAUTION] Using this plugin (and any proxy for Antigravity) violates Google's Terms of Service. A number of users have reported their Google accounts being banned or shadow-banned (restricted access without explicit notification).
By using this plugin, you acknowledge:
- This is an unofficial tool not endorsed by Google
- Your account may be suspended or permanently banned
- You assume all risks associated with using this plugin
Option A: Let an LLM do it
Paste this into any LLM agent (Claude Code, OpenCode, Cursor, etc.):
Install the opencode-antigravity-auth plugin and add the Antigravity model definitions to ~/.config/opencode/opencode.json by following: https://raw.githubusercontent.com/NoeFabris/opencode-antigravity-auth/dev/README.md
Option B: Manual setup
Add the plugin to ~/.config/opencode/opencode.json:
{
"plugin": ["opencode-antigravity-auth@latest"]
}
Want bleeding-edge features? Use
opencode-antigravity-auth@betainstead.
Login with your Google account:
opencode auth login
Add models — choose one:
opencode auth login → Google → OAuth with Google (Antigravity) → select "Configure models in opencode.json" (auto-configures all models)Use it:
opencode run "Hello" --model=google/antigravity-claude-opus-4-6-thinking --variant=max
Edit the OpenCode configuration file at ~/.config/opencode/opencode.json
Note: This path works on all platforms. On Windows,
~resolves to your user home directory (e.g.,C:\Users\YourName).
Add the plugin to the plugin array
Add the model definitions from the Full models configuration section
Set provider to "google" and choose a model
opencode run "Hello" --model=google/antigravity-claude-opus-4-6-thinking --variant=max
Antigravity quota (default routing for Claude and Gemini):
| 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-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 |
Gemini CLI quota (separate from Antigravity; used when cli_first is true or as fallback):
| Model | Notes |
|---|---|
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) |
Routing Behavior:
- Antigravity-first (default): Gemini models use Antigravity quota across accounts.
- CLI-first (
cli_first: true): Gemini models use Gemini CLI quota first.- When a Gemini quota pool is exhausted, the plugin automatically falls back to the other pool.
- Claude and image models always use Antigravity. Model names are automatically transformed for the target API (e.g.,
antigravity-gemini-3-flash→gemini-3-flash-previewfor CLI).
Using variants:
opencode run "Hello" --model=google/antigravity-claude-opus-4-6-thinking --variant=max
For details on variant configuration and thinking levels, see docs/MODEL-VARIANTS.md.
Add this to your ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["opencode-antigravity-auth@latest"],
"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 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
"variants": {
"low": { "thinkingLevel": "low" },
"high": { "thinkingLevel": "high" }
}
},
"antigravity-gemini-3-flash": {
"name": "Gemini 3 Flash (Antigravity)",
"limit": { "context": 1048576, "output": 65536 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
"variants": {
"minimal": { "thinkingLevel": "minimal" },
"low": { "thinkingLevel": "low" },
"medium": { "thinkingLevel": "medium" },
"high": { "thinkingLevel": "high" }
}
},
"antigravity-claude-sonnet-4-6": {
"name": "Claude Sonnet 4.6 (Antigravity)",
"limit": { "context": 200000, "output": 64000 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
},
"antigravity-claude-opus-4-6-thinking": {
"name": "Claude Opus 4.6 Thinking (Antigravity)",
"limit": { "context": 200000, "output": 64000 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
"variants": {
"low": { "thinkingConfig": { "thinkingBudget": 8192 } },
"max": { "thinkingConfig": { "thinkingBudget": 32768 } }
}
},
"gemini-2.5-flash": {
"name": "Gemini 2.5 Flash (Gemini CLI)",
"limit": { "context": 1048576, "output": 65536 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
},
"gemini-2.5-pro": {
"name": "Gemini 2.5 Pro (Gemini CLI)",
"limit": { "context": 1048576, "output": 65536 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
},
"gemini-3-flash-preview": {
"name": "Gemini 3 Flash Preview (Gemini CLI)",
"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 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
},
"gemini-3.1-pro-preview-customtools": {
"name": "Gemini 3.1 Pro Preview Custom Tools (Gemini CLI)",
"limit": { "context": 1048576, "output": 65535 },
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
}
}
}
}
}
Backward Compatibility: Legacy model names with
antigravity-prefix (e.g.,antigravity-gemini-3-flash) still work. The plugin automatically handles model name transformation for both Antigravity and Gemini CLI APIs.
Add multiple Google accounts for a higher combined quota. The plugin automatically rotates between accounts when one is rate-limited.
opencode auth login # Run again to add more accounts
Account management options (via opencode auth login):
For details on load balancing, dual quota pools, and account storage, see docs/MULTI-ACCOUNT.md.
Quick Reset: Most issues can be resolved by deleting
~/.config/opencode/antigravity-accounts.jsonand runningopencode auth loginagain.
OpenCode uses ~/.config/opencode/ on all platforms including Windows.
| File | Path |
|---|---|
| Main config | ~/.config/opencode/opencode.json |
| Accounts | ~/.config/opencode/antigravity-accounts.json |
| Plugin config | ~/.config/opencode/antigravity.json |
| Debug logs | ~/.config/opencode/antigravity-logs/ |
Windows users:
~resolves to your user home directory (e.g.,C:\Users\YourName). Do NOT use%APPDATA%.
Custom path: Set
OPENCODE_CONFIG_DIRenvironment variable to use a custom location.
Windows migration: If upgrading from plugin v1.3.x or earlier, the plugin will automatically find your existing config in
%APPDATA%\opencode\and use it. New installations use~/.config/opencode/.
If you encounter authentication issues with multiple accounts:
rm ~/.config/opencode/antigravity-accounts.json
opencode auth login
rising-fact-p41fc)Error:
Permission 'cloudaicompanion.companions.generateChat' denied on resource
'//cloudaicompanion.googleapis.com/projects/rising-fact-p41fc/locations/global'
Cause: Plugin falls back to a default project ID when no valid project is found. This works for Antigravity but fails for Gemini CLI models.
Solution:
cloudaicompanion.googleapis.com)projectId to your accounts file:{
"accounts": [
{
"email": "[email protected]",
"refreshToken": "...",
"projectId": "your-project-id"
}
]
}
Note: Do this for each account in a multi-account setup.
Add this to your google provider config:
{
"provider": {
"google": {
"npm": "@ai-sdk/google",
"models": { ... }
}
}
}
Error:
Invalid JSON payload received. Unknown name "parameters" at 'request.tools[0]'
Causes:
Solutions:
Update to latest beta:
{ "plugin": ["opencode-antigravity-auth@beta"] }
Disable MCP servers one-by-one to find the problematic one
Add npm override:
{ "provider": { "google": { "npm": "@ai-sdk/google" } } }
Some MCP servers have schemas incompatible with Antigravity's strict JSON format.
Common symptom:
Invalid function name must start with a letter or underscore
Sometimes it shows up as:
GenerateContentRequest.tools[0].function_declarations[12].name: Invalid function name must start with a letter or underscore
This usually means an MCP tool name starts with a number (for example, a 1mcp key like 1mcp_*). Rename the MCP key to start with a letter (e.g., gw) or disable that MCP entry for Antigravity models.
Diagnosis:
Cause: Cascade bug in clearExpiredRateLimits() in hybrid mode (fixed in recent beta).
Solutions:
account_selection_strategy to "sticky" in antigravity.jsonIf you encounter errors during a session:
continue to trigger the recovery mechanism/undo to revert to pre-error stateImportant: Disable the built-in Google auth to prevent conflicts:
// ~/.config/opencode/oh-my-opencode.json
{
"google_auth": false,
"agents": {
"frontend-ui-ux-engineer": { "model": "google/antigravity-gemini-3-pro" },
"document-writer": { "model": "google/antigravity-gemini-3-flash" }
}
}
.tmp Files CreatedCause: When account is rate-limited and plugin retries infinitely, it creates many temp files.
Workaround:
rm ~/.config/opencode/*.tmpSymptoms:
Cause: Safari's "HTTPS-Only Mode" blocks http://localhost callback.
Solutions:
Use Chrome or Firefox (easiest): Copy the OAuth URL and paste into a different browser.
Disable HTTPS-Only Mode temporarily:
opencode auth loginmacOS / Linux:
# Find process using the port
lsof -i :51121
# Kill if stale
kill -9 <PID>
# Retry
opencode auth login
Windows (PowerShell):
netstat -ano | findstr :51121
taskkill /PID <PID> /F
opencode auth login
OAuth callback requires browser to reach localhost on the machine running OpenCode.
WSL2:
SSH / Remote:
ssh -L 51121:localhost:51121 user@remote
Docker / Containers:
plugin not pluginsThe correct key is plugin (singular):
{
"plugin": ["opencode-antigravity-auth@beta"]
}
Not "plugins" (will cause "Unrecognized key" error).
When copying antigravity-accounts.json to a new machine:
"plugin": ["opencode-antigravity-auth@beta"]~/.config/opencode/antigravity-accounts.jsonFor details on load balancing, dual quota pools, and account storage, see docs/MULTI-ACCOUNT.md.
DCP creates synthetic assistant messages that lack thinking blocks. List this plugin BEFORE DCP:
{
"plugin": [
"opencode-antigravity-auth@latest",
"@tarquinen/opencode-dcp@latest"
]
}
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" },
"document-writer": { "model": "google/antigravity-gemini-3-flash" },
"multimodal-looker": { "model": "google/antigravity-gemini-3-flash" }
}
}
Tip: When spawning parallel subagents, enable
pid_offset_enabled: trueinantigravity.jsonto distribute sessions across accounts.
Create ~/.config/opencode/antigravity.json for optional settings:
{
"$schema": "https://raw.githubusercontent.com/NoeFabris/opencode-antigravity-auth/main/assets/antigravity.schema.json"
}
Most users don't need to configure anything — defaults work well.
| Option | Default | What it does |
|---|---|---|
keep_thinking |
false |
Preserve Claude's thinking across turns. Warning: enabling may degrade model stability. |
session_recovery |
true |
Auto-recover from tool errors |
cli_first |
false |
Route Gemini models to Gemini CLI first (Claude and image models stay on Antigravity). |
| Your Setup | Recommended Config |
|---|---|
| 1 account | "account_selection_strategy": "sticky" |
| 2-5 accounts | Default ("hybrid") works great |
| 5+ accounts | "account_selection_strategy": "round-robin" |
| Parallel agents | Add "pid_offset_enabled": true |
| Option | Default | What it does |
|---|---|---|
soft_quota_threshold_percent |
90 |
Skip account when quota usage exceeds this percentage. Prevents Google from penalizing accounts that fully exhaust quota. Set to 100 to disable. |
quota_refresh_interval_minutes |
15 |
Background quota refresh interval. After successful API requests, refreshes quota cache if older than this interval. Set to 0 to disable. |
soft_quota_cache_ttl_minutes |
"auto" |
How long quota cache is considered fresh. "auto" = max(2 × refresh interval, 10 minutes). Set a number (1-120) for fixed TTL. |
How it works: Quota cache is refreshed automatically after API requests (when older than
quota_refresh_interval_minutes) and manually via "Check quotas" inopencode auth login. The threshold check uses `soft_quot