# Antigravity + Gemini CLI OAuth Plugin for Opencode [![npm version](https://img.shields.io/npm/v/opencode-antigravity-auth.svg)](https://www.npmjs.com/package/opencode-antigravity-auth) [![npm beta](https://img.shields.io/npm/v/opencode-antigravity-auth/beta.svg?label=beta)](https://www.npmjs.com/package/opencode-antigravity-auth) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) Enable Opencode to authenticate against **Antigravity** (Google's IDE) via OAuth so you can use Antigravity rate limits and access models like `gemini-3-pro` and `claude-opus-4-5-thinking` with your Google credentials. ## What you get - **Google OAuth sign-in** with automatic token refresh via `opencode auth login` - **Dual Quota System** - Access both Antigravity quota (Claude, Gemini 3) and Gemini CLI quota from a single plugin - **Multi-Account Rotation** - Add multiple Google accounts; automatically rotates when one is rate-limited - **Real-time SSE streaming** including thinking blocks and incremental output - **Model Variants** - Configure thinking budget dynamically via OpenCode's variant system - **Extended Thinking** - Native support for Claude thinking budgets and Gemini 3 thinking levels - **Auto Recovery** - Automatic session recovery from Claude tool_result_missing errors - **Plugin Compatible** - Works alongside other OpenCode plugins (opencodesync, etc.) ## Installation ### For Humans **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** 1. **Add the plugin to your config** (`~/.config/opencode/opencode.json`): ```json { "plugin": ["opencode-antigravity-auth@beta"] } ``` 2. **Authenticate:** ```bash opencode auth login ``` 3. **Add models** (see [Available Models](#available-models) for full list): ```json { "plugin": ["opencode-antigravity-auth@beta"], "provider": { "google": { "models": { "antigravity-claude-sonnet-4-5-thinking": { "name": "Claude Sonnet 4.5 Thinking", "limit": { "context": 200000, "output": 64000 }, "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "variants": { "low": { "thinkingConfig": { "thinkingBudget": 8192 } }, "max": { "thinkingConfig": { "thinkingBudget": 32768 } } } } } } } } ``` 4. **Use it:** ```bash opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5-thinking --variant=max ```
Installation Guide for LLM Agents ### Step-by-Step Instructions 1. Edit the OpenCode configuration file: - Linux/Mac: `~/.config/opencode/opencode.json` - Windows: `%APPDATA%\opencode\opencode.json` 2. Add the plugin to the `plugins` array 3. Set `provider` to `"google"` and choose a model ### Complete Configuration Example Create `~/.config/opencode/opencode.json`: ```json { "$schema": "https://opencode.ai/config.json", "plugin": ["opencode-antigravity-auth@beta"], "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-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-5": { "name": "Claude Sonnet 4.5 (Antigravity)", "limit": { "context": 200000, "output": 64000 }, "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] } }, "antigravity-claude-sonnet-4-5-thinking": { "name": "Claude Sonnet 4.5 Thinking (Antigravity)", "limit": { "context": 200000, "output": 64000 }, "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "variants": { "low": { "thinkingConfig": { "thinkingBudget": 8192 } }, "max": { "thinkingConfig": { "thinkingBudget": 32768 } } } }, "antigravity-claude-opus-4-5-thinking": { "name": "Claude Opus 4.5 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"] } } } } } } ``` ### Verification ```bash opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5-thinking --variant=max ```
## Available Models ### Antigravity Quota (with Variants) Models with `antigravity-` prefix use Antigravity quota. **Thinking models support variants** for dynamic thinking budget configuration: | Model | Variants | Description | |-------|----------|-------------| | `google/antigravity-gemini-3-pro` | low, high | Gemini 3 Pro with configurable thinking | | `google/antigravity-gemini-3-flash` | minimal, low, medium, high | Gemini 3 Flash with configurable thinking | | `google/antigravity-claude-sonnet-4-5` | - | Claude Sonnet 4.5 (no thinking) | | `google/antigravity-claude-sonnet-4-5-thinking` | low, max | Claude Sonnet with configurable thinking | | `google/antigravity-claude-opus-4-5-thinking` | low, max | Claude Opus with configurable thinking | **Variant configuration:** - **Gemini 3**: Uses `thinkingLevel` string (`"low"`, `"medium"`, `"high"`) - **Claude**: Uses `thinkingBudget` number (8192, 32768 tokens) **Usage:** ```bash opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5-thinking --variant=max ``` ### Gemini CLI Quota Models with `-preview` suffix use Gemini CLI quota: | Model | Description | |-------|-------------| | `google/gemini-2.5-flash` | Gemini 2.5 Flash | | `google/gemini-2.5-pro` | Gemini 2.5 Pro | | `google/gemini-3-flash-preview` | Gemini 3 Flash (preview) | | `google/gemini-3-pro-preview` | Gemini 3 Pro (preview) |
Full models configuration (copy-paste ready) ```json { "$schema": "https://opencode.ai/config.json", "plugin": ["opencode-antigravity-auth@beta"], "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-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-5": { "name": "Claude Sonnet 4.5 (no thinking) (Antigravity)", "limit": { "context": 200000, "output": 64000 }, "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] } }, "antigravity-claude-sonnet-4-5-thinking": { "name": "Claude Sonnet 4.5 Thinking (Antigravity)", "limit": { "context": 200000, "output": 64000 }, "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "variants": { "low": { "thinkingConfig": { "thinkingBudget": 8192 } }, "max": { "thinkingConfig": { "thinkingBudget": 32768 } } } }, "antigravity-claude-opus-4-5-thinking": { "name": "Claude Opus 4.5 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"] } } } } } } ```
## Model Variants OpenCode's variant system allows you to configure thinking budget dynamically instead of defining separate models for each thinking level. ### How Variants Work When you define a model with `variants`, OpenCode will show variant options in the model picker. Selecting a variant passes the `providerOptions` to the plugin, which extracts the thinking configuration. ### Variant Configuration ```json { "antigravity-claude-sonnet-4-5-thinking": { "name": "Claude Sonnet 4.5 Thinking", "limit": { "context": 200000, "output": 64000 }, "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "variants": { "low": { "thinkingConfig": { "thinkingBudget": 8192 } }, "max": { "thinkingConfig": { "thinkingBudget": 32768 } } } } } ``` ### Supported Variant Formats The plugin accepts different variant formats depending on the model family: | Model Family | Variant Format | |--------------|----------------| | **Gemini 3** | `{ "thinkingLevel": "low" \| "medium" \| "high" }` | | **Claude** | `{ "thinkingConfig": { "thinkingBudget": N } }` | | **Gemini 2.5** | `{ "thinkingConfig": { "thinkingBudget": N } }` | ### Gemini 3 Thinking Levels Gemini 3 models use string-based thinking levels. Available levels differ by model: | Level | Flash | Pro | Description | |-------|-------|-----|-------------| | `minimal` | Yes | No | Minimal thinking, lowest latency | | `low` | Yes | Yes | Light thinking | | `medium` | Yes | No | Balanced thinking | | `high` | Yes | Yes | Maximum thinking (default for both Pro and Flash) | > **Note:** The API will reject invalid levels (e.g., `"minimal"` on Pro). Configure variants accordingly. ### Legacy Budget Format (Deprecated) For Gemini 3 models, the old `thinkingBudget` format is still supported but deprecated: | Budget Range | Maps to Level | |--------------|---------------| | ≤ 8192 | low | | ≤ 16384 | medium | | > 16384 | high | ### Backward Compatibility Legacy tier-suffixed models still work: - `antigravity-claude-sonnet-4-5-thinking-low` - `antigravity-claude-sonnet-4-5-thinking-medium` - `antigravity-claude-sonnet-4-5-thinking-high` - `antigravity-gemini-3-pro-low` - `antigravity-gemini-3-pro-high` However, **we recommend using variants** for a cleaner model picker and more flexibility. ## Multi-Account Setup Add multiple Google accounts for higher combined quotas. The plugin automatically rotates between accounts when one is rate-limited. ```bash opencode auth login ```
How multi-account works ### Load Balancing Behavior - **Sticky account selection** - Sticks to the same account until rate-limited (preserves Anthropic's prompt cache) - **Per-model-family limits** - Rate limits tracked separately for Claude and Gemini models - **Dual quota pools for Gemini** - Automatic fallback between Antigravity quota and Gemini CLI quota before switching accounts - **Smart retry threshold** - Short rate limits (≤5s) are retried on same account - **Exponential backoff** - Increasing delays for consecutive rate limits ### Dual Quota Pools (Gemini only) For Gemini models, the plugin accesses **two independent quota pools** per account: | Quota Pool | When Used | |------------|-----------| | **Antigravity** | Primary (tried first) | | **Gemini CLI** | Fallback when Antigravity is rate-limited | This effectively **doubles your Gemini quota** per account. ### Adding Accounts When running `opencode auth login` with existing accounts: ``` 2 account(s) saved: 1. user1@gmail.com 2. user2@gmail.com (a)dd new account(s) or (f)resh start? [a/f]: ``` ### Account Storage - Stored in `~/.config/opencode/antigravity-accounts.json` - Contains OAuth refresh tokens - **treat like a password** - If Google revokes a token (`invalid_grant`), that account is automatically removed
## Configuration Create `~/.config/opencode/antigravity.json` (or `.opencode/antigravity.json` in project root): ### General Settings | Option | Default | Description | |--------|---------|-------------| | `quiet_mode` | `false` | Suppress toast notifications (except recovery) | | `debug` | `false` | Enable debug logging to file | | `log_dir` | OS default | Custom directory for debug logs | | `auto_update` | `true` | Enable automatic plugin updates | | `keep_thinking` | `false` | ⚠️ **Experimental.** Preserve Claude's thinking blocks via signature caching. Required for conversation continuity when using thinking models. See [Signature Cache](#signature-cache) for cache settings. | ### Session Recovery | Option | Default | Description | |--------|---------|-------------| | `session_recovery` | `true` | Auto-recover from tool_result_missing errors | | `auto_resume` | `true` | Auto-send resume prompt after recovery | | `resume_text` | `"continue"` | Text to send when auto-resuming | ### Error Recovery | Option | Default | Description | |--------|---------|-------------| | `empty_response_max_attempts` | `4` | Retries for empty API responses | | `empty_response_retry_delay_ms` | `2000` | Delay between retries | | `tool_id_recovery` | `true` | Fix mismatched tool IDs from context compaction | | `claude_tool_hardening` | `true` | Prevent tool parameter hallucination | ### Signature Cache > ⚠️ **Experimental Feature** - Signature caching is experimental and may have edge cases. Please report issues. When `keep_thinking` is enabled, the plugin caches thinking block signatures to preserve conversation continuity across requests. | Option | Default | Description | |--------|---------|-------------| | `signature_cache.enabled` | `true` | Enable disk caching of thinking block signatures | | `signature_cache.memory_ttl_seconds` | `3600` | In-memory cache TTL (1 hour) | | `signature_cache.disk_ttl_seconds` | `172800` | Disk cache TTL (48 hours) | | `signature_cache.write_interval_seconds` | `60` | Background write interval | ### Token Management | Option | Default | Description | |--------|---------|-------------| | `proactive_token_refresh` | `true` | Refresh tokens before expiry | | `proactive_refresh_buffer_seconds` | `1800` | Refresh 30min before expiry | | `max_rate_limit_wait_seconds` | `300` | Max wait time when rate limited (0=unlimited) | | `quota_fallback` | `false` | **Gemini only.** When rate-limited on primary quota pool (Antigravity or Gemini CLI), automatically try the alternate pool before switching accounts. Effectively doubles retry attempts per account. See [Dual Quota Pools](#dual-quota-pools-gemini-only). | | `switch_on_first_rate_limit` | `true` | Switch account immediately on first 429 (after 1s) | ### Account Selection | Option | Default | Description | |--------|---------|-------------| | `account_selection_strategy` | `"sticky"` | Strategy for distributing requests across accounts | | `pid_offset_enabled` | `false` | Use PID-based offset for multi-session distribution | **Available strategies:** | Strategy | Behavior | Best For | |----------|----------|----------| | `sticky` | Same account until rate-limited | Prompt cache preservation | | `round-robin` | Rotate to next account on every request | Maximum throughput | | `hybrid` | Touch all fresh accounts first, then sticky | Sync reset timers + cache | **Error handling:** | Error Type | Behavior | |------------|----------| | `MODEL_CAPACITY_EXHAUSTED` | Wait (escalating 5s→60s) and retry same account | | `QUOTA_EXCEEDED` | Switch to next available account immediately | This prevents unnecessary account switching when server-side capacity issues affect all accounts equally. ### Environment Overrides ```bash OPENCODE_ANTIGRAVITY_QUIET=1 # quiet_mode OPENCODE_ANTIGRAVITY_DEBUG=1 # debug OPENCODE_ANTIGRAVITY_LOG_DIR=/path # log_dir OPENCODE_ANTIGRAVITY_KEEP_THINKING=1 # keep_thinking OPENCODE_ANTIGRAVITY_ACCOUNT_SELECTION_STRATEGY=round-robin # account_selection_strategy OPENCODE_ANTIGRAVITY_PID_OFFSET_ENABLED=1 # pid_offset_enabled ```
Full configuration example ```json { "$schema": "https://raw.githubusercontent.com/NoeFabris/opencode-antigravity-auth/main/assets/antigravity.schema.json", "quiet_mode": false, "debug": false, "log_dir": "/custom/log/path", "auto_update": true, "keep_thinking": false, "session_recovery": true, "auto_resume": true, "resume_text": "continue", "empty_response_max_attempts": 4, "empty_response_retry_delay_ms": 2000, "tool_id_recovery": true, "claude_tool_hardening": true, "proactive_token_refresh": true, "proactive_refresh_buffer_seconds": 1800, "proactive_refresh_check_interval_seconds": 300, "max_rate_limit_wait_seconds": 300, "quota_fallback": false, "account_selection_strategy": "sticky", "pid_offset_enabled": false, "signature_cache": { "enabled": true, "memory_ttl_seconds": 3600, "disk_ttl_seconds": 172800, "write_interval_seconds": 60 } } ```
## Troubleshoot ### Multi account auth issues If you encounter auth issue please try remove `antigravity-account.json` and auth again ### Gemini model not found Try add this line to in `google` field under `provider` `"npm": "@ai-sdk/google"` ### Error during the session If you encounter error during the session, try chat `continue` the recover session mechanism should be trigger and you can continue the session, if the error blocked the session please workaround by use command `/undo` to revert to the state before the error and try again it should work ## Known Plugin Interactions ### @tarquinen/opencode-dcp DCP creates synthetic assistant messages that lack thinking blocks. **Our plugin must be listed BEFORE DCP:** ```json { "plugin": [ "opencode-antigravity-auth@beta", "@tarquinen/opencode-dcp@latest", ] } ``` ### oh-my-opencode When using opencode-antigravity-auth, disable the built-in auth and override agent models in oh-my-opencode.json: ```json { "google_auth": false, "agents": { "frontend-ui-ux-engineer": { "model": "google/gemini-3-pro-high" }, "document-writer": { "model": "google/gemini-3-flash" }, "multimodal-looker": { "model": "google/gemini-3-flash" } } } ``` When spawning parallel subagents, multiple processes may select the same account causing rate limit errors. **Workaround:** Enable `pid_offset_enabled: true` to distribute sessions across accounts, or add more accounts via `opencode auth login`. ### Plugins You Don't Need - **gemini-auth plugins** - Not needed. This plugin handles all Google OAuth authentication.
Migration Guide (v1.2.8+ - Variants) ### What Changed v1.2.8+ introduces **model variants** for dynamic thinking configuration. Instead of separate models for each thinking level, you now define one model with variants. ### Before (v1.2.7) ```json { "antigravity-claude-sonnet-4-5-thinking-low": { ... }, "antigravity-claude-sonnet-4-5-thinking-medium": { ... }, "antigravity-claude-sonnet-4-5-thinking-high": { ... } } ``` ### After (v1.2.8+) ```json { "antigravity-claude-sonnet-4-5-thinking": { "name": "Claude Sonnet 4.5 Thinking", "limit": { "context": 200000, "output": 64000 }, "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "variants": { "low": { "thinkingConfig": { "thinkingBudget": 8192 } }, "max": { "thinkingConfig": { "thinkingBudget": 32768 } } } } } ``` ### Benefits - **Cleaner model picker** - 4 models instead of 12+ - **Flexible budgets** - Define any budget, not just low/max - **Future-proof** - Works with OpenCode's native variant system ### Backward Compatibility Old tier-suffixed models (`antigravity-claude-sonnet-4-5-thinking-low`, etc.) still work. No action required if you prefer the old style.
Migration Guide (v1.2.7 - Prefix) If upgrading from v1.2.6 or earlier: ### What Changed v1.2.7+ uses explicit prefixes to distinguish quota sources: | Model Type | New Name (Recommended) | Old Name (Still Works) | |------------|------------------------|------------------------| | Gemini 3 (Antigravity) | `antigravity-gemini-3-pro` | `gemini-3-pro-low` | | Gemini 3 (CLI) | `gemini-3-pro-preview` | N/A | | Claude | `antigravity-claude-sonnet-4-5` | `claude-sonnet-4-5` | ### Action Required **Update your config to use `antigravity-` prefix:** ```diff - "gemini-3-pro-low": { ... } + "antigravity-gemini-3-pro": { ... } ``` > **Why update?** Old names work now as a fallback, but this depends on Gemini CLI using `-preview` suffix. If Google removes `-preview` in the future, old names may route to the wrong quota. The `antigravity-` prefix is explicit and stable. ### Step 1: Clear Old Tokens (Optional - do this if you have issues calling models) ```bash rm -rf ~/.config/opencode/antigravity-account.json opencode auth login ``` ### Step 2: Update opencode.json Models now use `antigravity-` prefix for Antigravity quota. See [Available Models](#available-models). ### Step 3: Create antigravity.json (Optional) ```json { "$schema": "https://raw.githubusercontent.com/NoeFabris/opencode-antigravity-auth/main/assets/antigravity.schema.json", "quiet_mode": false, "debug": false } ```
E2E Testing The plugin includes regression tests for stability verification. Tests consume API quota. ```bash # Sanity tests (7 tests, ~5 min) npx tsx script/test-regression.ts --sanity # Heavy tests (4 tests, ~30 min) npx tsx script/test-regression.ts --heavy # Concurrent tests (3 tests) npx tsx script/test-regression.ts --category concurrency # Run specific test npx tsx script/test-regression.ts --test thinking-tool-use # List tests without running npx tsx script/test-regression.ts --dry-run ```
## Debugging ```bash OPENCODE_ANTIGRAVITY_DEBUG=1 opencode # Basic logging OPENCODE_ANTIGRAVITY_DEBUG=2 opencode # Verbose (full request/response bodies) ``` Logs are written to `~/.config/opencode/antigravity-logs/`. ## Documentation - [Architecture](docs/ARCHITECTURE.md) - Plugin internals and request flow - [API Spec](docs/ANTIGRAVITY_API_SPEC.md) - Antigravity API reference
Safety, Usage & Legal ### Intended Use - Personal / internal development only - Respect internal quotas and data handling policies - Not for production services or bypassing intended limits ### Warning (Assumption of Risk) By using this plugin, you acknowledge: - **Terms of Service risk** - This approach may violate ToS of AI model providers - **Account risk** - Providers may suspend or ban accounts - **No guarantees** - APIs may change without notice - **Assumption of risk** - You assume all legal, financial, and technical risks ### Legal - Not affiliated with Google. This is an independent open-source project. - "Antigravity", "Gemini", "Google Cloud", and "Google" are trademarks of Google LLC. - Software is provided "as is", without warranty.
## Credits Built with help from: - [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) - Gemini OAuth groundwork by [@jenslys](https://github.com/jenslys) - [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) - Antigravity API reference ## Support If this plugin helps you, consider supporting its continued maintenance: [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/S6S81QBOIR) ## License MIT