opencode-antigravity-auth 1.2.8-beta.0 → 1.2.8-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +243 -131
- package/dist/src/plugin/accounts.d.ts +9 -1
- package/dist/src/plugin/accounts.d.ts.map +1 -1
- package/dist/src/plugin/accounts.js +81 -1
- package/dist/src/plugin/accounts.js.map +1 -1
- package/dist/src/plugin/config/loader.d.ts.map +1 -1
- package/dist/src/plugin/config/loader.js +5 -1
- package/dist/src/plugin/config/loader.js.map +1 -1
- package/dist/src/plugin/config/schema.d.ts +17 -0
- package/dist/src/plugin/config/schema.d.ts.map +1 -1
- package/dist/src/plugin/config/schema.js +15 -0
- package/dist/src/plugin/config/schema.js.map +1 -1
- package/dist/src/plugin/recovery.d.ts.map +1 -1
- package/dist/src/plugin/recovery.js +0 -1
- package/dist/src/plugin/recovery.js.map +1 -1
- package/dist/src/plugin/request-helpers.d.ts +7 -0
- package/dist/src/plugin/request-helpers.d.ts.map +1 -1
- package/dist/src/plugin/request-helpers.js +36 -0
- package/dist/src/plugin/request-helpers.js.map +1 -1
- package/dist/src/plugin/request.d.ts.map +1 -1
- package/dist/src/plugin/request.js +18 -5
- package/dist/src/plugin/request.js.map +1 -1
- package/dist/src/plugin/storage.d.ts.map +1 -1
- package/dist/src/plugin/storage.js +104 -3
- package/dist/src/plugin/storage.js.map +1 -1
- package/dist/src/plugin/transform/index.d.ts +2 -1
- package/dist/src/plugin/transform/index.d.ts.map +1 -1
- package/dist/src/plugin/transform/index.js +1 -1
- package/dist/src/plugin/transform/index.js.map +1 -1
- package/dist/src/plugin/transform/model-resolver.d.ts +11 -0
- package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -1
- package/dist/src/plugin/transform/model-resolver.js +36 -0
- package/dist/src/plugin/transform/model-resolver.js.map +1 -1
- package/dist/src/plugin/transform/types.d.ts +2 -0
- package/dist/src/plugin/transform/types.d.ts.map +1 -1
- package/dist/src/plugin.d.ts.map +1 -1
- package/dist/src/plugin.js +21 -28
- package/dist/src/plugin.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/opencode-antigravity-auth)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
|
|
7
|
-
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
|
|
7
|
+
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.
|
|
8
8
|
|
|
9
9
|
## What you get
|
|
10
10
|
|
|
@@ -12,6 +12,7 @@ Enable Opencode to authenticate against **Antigravity** (Google's IDE) via OAuth
|
|
|
12
12
|
- **Dual Quota System** - Access both Antigravity quota (Claude, Gemini 3) and Gemini CLI quota from a single plugin
|
|
13
13
|
- **Multi-Account Rotation** - Add multiple Google accounts; automatically rotates when one is rate-limited
|
|
14
14
|
- **Real-time SSE streaming** including thinking blocks and incremental output
|
|
15
|
+
- **Model Variants** - Configure thinking budget dynamically via OpenCode's variant system
|
|
15
16
|
- **Extended Thinking** - Native support for Claude thinking budgets and Gemini 3 thinking levels
|
|
16
17
|
- **Auto Recovery** - Automatic session recovery from Claude tool_result_missing errors
|
|
17
18
|
- **Plugin Compatible** - Works alongside other OpenCode plugins (opencodesync, etc.)
|
|
@@ -25,7 +26,7 @@ Enable Opencode to authenticate against **Antigravity** (Google's IDE) via OAuth
|
|
|
25
26
|
Paste this into any LLM agent (Claude Code, OpenCode, Cursor, etc.):
|
|
26
27
|
|
|
27
28
|
```
|
|
28
|
-
Install the opencode-antigravity-auth plugin and add the Antigravity model definitions to ~/.config/opencode/opencode.json by following: https://raw.githubusercontent.com/
|
|
29
|
+
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
|
|
29
30
|
```
|
|
30
31
|
|
|
31
32
|
**Option B: Manual setup**
|
|
@@ -52,10 +53,15 @@ Install the opencode-antigravity-auth plugin and add the Antigravity model defin
|
|
|
52
53
|
"provider": {
|
|
53
54
|
"google": {
|
|
54
55
|
"models": {
|
|
55
|
-
"antigravity-claude-sonnet-4-5": {
|
|
56
|
-
"name": "Claude Sonnet 4.5
|
|
56
|
+
"antigravity-claude-sonnet-4-5-thinking": {
|
|
57
|
+
"name": "Claude Sonnet 4.5 Thinking",
|
|
57
58
|
"limit": { "context": 200000, "output": 64000 },
|
|
58
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
59
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
60
|
+
"variants": {
|
|
61
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
62
|
+
"medium": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 16384 } } } },
|
|
63
|
+
"high": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
64
|
+
}
|
|
59
65
|
}
|
|
60
66
|
}
|
|
61
67
|
}
|
|
@@ -66,7 +72,7 @@ Install the opencode-antigravity-auth plugin and add the Antigravity model defin
|
|
|
66
72
|
4. **Use it:**
|
|
67
73
|
|
|
68
74
|
```bash
|
|
69
|
-
opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5
|
|
75
|
+
opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5-thinking --variant=medium
|
|
70
76
|
```
|
|
71
77
|
|
|
72
78
|
<details>
|
|
@@ -92,69 +98,68 @@ Create `~/.config/opencode/opencode.json`:
|
|
|
92
98
|
"provider": {
|
|
93
99
|
"google": {
|
|
94
100
|
"models": {
|
|
95
|
-
"antigravity-gemini-3-pro
|
|
96
|
-
"name": "Gemini 3 Pro
|
|
101
|
+
"antigravity-gemini-3-pro": {
|
|
102
|
+
"name": "Gemini 3 Pro",
|
|
97
103
|
"limit": { "context": 1048576, "output": 65535 },
|
|
98
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
104
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
105
|
+
"variants": {
|
|
106
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
107
|
+
"high": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
108
|
+
}
|
|
104
109
|
},
|
|
105
110
|
"antigravity-gemini-3-flash": {
|
|
106
|
-
"name": "Gemini 3 Flash
|
|
107
|
-
"limit": { "context": 1048576, "output": 65536 },
|
|
108
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
109
|
-
},
|
|
110
|
-
"gemini-3-pro-low": {
|
|
111
|
-
"name": "Gemini 3 Pro Low (Antigravity)",
|
|
112
|
-
"limit": { "context": 1048576, "output": 65535 },
|
|
113
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
114
|
-
},
|
|
115
|
-
"gemini-3-pro-high": {
|
|
116
|
-
"name": "Gemini 3 Pro High (Antigravity)",
|
|
117
|
-
"limit": { "context": 1048576, "output": 65535 },
|
|
118
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
119
|
-
},
|
|
120
|
-
"gemini-3-flash": {
|
|
121
|
-
"name": "Gemini 3 Flash (Antigravity)",
|
|
111
|
+
"name": "Gemini 3 Flash",
|
|
122
112
|
"limit": { "context": 1048576, "output": 65536 },
|
|
123
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
113
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
114
|
+
"variants": {
|
|
115
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
116
|
+
"medium": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 16384 } } } },
|
|
117
|
+
"high": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
118
|
+
}
|
|
124
119
|
},
|
|
125
120
|
"antigravity-claude-sonnet-4-5": {
|
|
126
|
-
"name": "Claude Sonnet 4.5 (
|
|
121
|
+
"name": "Claude Sonnet 4.5 (no thinking)",
|
|
127
122
|
"limit": { "context": 200000, "output": 64000 },
|
|
128
123
|
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
129
124
|
},
|
|
130
|
-
"antigravity-claude-sonnet-4-5-thinking
|
|
131
|
-
"name": "Claude Sonnet 4.5
|
|
125
|
+
"antigravity-claude-sonnet-4-5-thinking": {
|
|
126
|
+
"name": "Claude Sonnet 4.5 Thinking",
|
|
132
127
|
"limit": { "context": 200000, "output": 64000 },
|
|
133
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
128
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
129
|
+
"variants": {
|
|
130
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
131
|
+
"medium": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 16384 } } } },
|
|
132
|
+
"max": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
133
|
+
}
|
|
134
134
|
},
|
|
135
|
-
"antigravity-claude-
|
|
136
|
-
"name": "Claude
|
|
135
|
+
"antigravity-claude-opus-4-5-thinking": {
|
|
136
|
+
"name": "Claude Opus 4.5 Thinking",
|
|
137
137
|
"limit": { "context": 200000, "output": 64000 },
|
|
138
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
138
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
139
|
+
"variants": {
|
|
140
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
141
|
+
"medium": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 16384 } } } },
|
|
142
|
+
"max": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
143
|
+
}
|
|
139
144
|
},
|
|
140
|
-
"
|
|
141
|
-
"name": "
|
|
142
|
-
"limit": { "context":
|
|
145
|
+
"gemini-2.5-flash": {
|
|
146
|
+
"name": "Gemini 2.5 Flash (CLI)",
|
|
147
|
+
"limit": { "context": 1048576, "output": 65536 },
|
|
143
148
|
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
144
149
|
},
|
|
145
|
-
"
|
|
146
|
-
"name": "
|
|
147
|
-
"limit": { "context":
|
|
150
|
+
"gemini-2.5-pro": {
|
|
151
|
+
"name": "Gemini 2.5 Pro (CLI)",
|
|
152
|
+
"limit": { "context": 1048576, "output": 65536 },
|
|
148
153
|
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
149
154
|
},
|
|
150
|
-
"
|
|
151
|
-
"name": "
|
|
152
|
-
"limit": { "context":
|
|
155
|
+
"gemini-3-flash-preview": {
|
|
156
|
+
"name": "Gemini 3 Flash Preview (CLI)",
|
|
157
|
+
"limit": { "context": 1048576, "output": 65536 },
|
|
153
158
|
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
154
159
|
},
|
|
155
|
-
"
|
|
156
|
-
"name": "
|
|
157
|
-
"limit": { "context":
|
|
160
|
+
"gemini-3-pro-preview": {
|
|
161
|
+
"name": "Gemini 3 Pro Preview (CLI)",
|
|
162
|
+
"limit": { "context": 1048576, "output": 65535 },
|
|
158
163
|
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
159
164
|
}
|
|
160
165
|
}
|
|
@@ -166,31 +171,34 @@ Create `~/.config/opencode/opencode.json`:
|
|
|
166
171
|
### Verification
|
|
167
172
|
|
|
168
173
|
```bash
|
|
169
|
-
opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5
|
|
174
|
+
opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5-thinking --variant=medium
|
|
170
175
|
```
|
|
171
176
|
|
|
172
177
|
</details>
|
|
173
178
|
|
|
174
179
|
## Available Models
|
|
175
180
|
|
|
176
|
-
### Antigravity Quota
|
|
181
|
+
### Antigravity Quota (with Variants)
|
|
177
182
|
|
|
178
|
-
Models with `antigravity-` prefix use Antigravity quota:
|
|
183
|
+
Models with `antigravity-` prefix use Antigravity quota. **Thinking models support variants** for dynamic thinking budget configuration:
|
|
179
184
|
|
|
180
|
-
| Model | Description |
|
|
181
|
-
|
|
182
|
-
| `google/antigravity-gemini-3-
|
|
183
|
-
| `google/antigravity-gemini-3-
|
|
184
|
-
| `google/antigravity-
|
|
185
|
-
| `google/antigravity-claude-sonnet-4-5` | Claude Sonnet
|
|
186
|
-
| `google/antigravity-claude-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
185
|
+
| Model | Variants | Description |
|
|
186
|
+
|-------|----------|-------------|
|
|
187
|
+
| `google/antigravity-gemini-3-pro` | low, high | Gemini 3 Pro with configurable thinking |
|
|
188
|
+
| `google/antigravity-gemini-3-flash` | low, medium, high | Gemini 3 Flash with configurable thinking |
|
|
189
|
+
| `google/antigravity-claude-sonnet-4-5` | - | Claude Sonnet 4.5 (no thinking) |
|
|
190
|
+
| `google/antigravity-claude-sonnet-4-5-thinking` | low, medium, max | Claude Sonnet with configurable thinking |
|
|
191
|
+
| `google/antigravity-claude-opus-4-5-thinking` | low, medium, max | Claude Opus with configurable thinking |
|
|
192
|
+
|
|
193
|
+
**Variant thinking budgets:**
|
|
194
|
+
- `low`: 8,192 tokens
|
|
195
|
+
- `medium`: 16,384 tokens
|
|
196
|
+
- `high`: 32,768 tokens
|
|
197
|
+
|
|
198
|
+
**Usage:**
|
|
199
|
+
```bash
|
|
200
|
+
opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5-thinking --variant=high
|
|
201
|
+
```
|
|
194
202
|
|
|
195
203
|
### Gemini CLI Quota
|
|
196
204
|
|
|
@@ -204,7 +212,7 @@ Models with `-preview` suffix use Gemini CLI quota:
|
|
|
204
212
|
| `google/gemini-3-pro-preview` | Gemini 3 Pro (preview) |
|
|
205
213
|
|
|
206
214
|
<details>
|
|
207
|
-
<summary><b>Full models configuration</b></summary>
|
|
215
|
+
<summary><b>Full models configuration (copy-paste ready)</b></summary>
|
|
208
216
|
|
|
209
217
|
```json
|
|
210
218
|
{
|
|
@@ -213,70 +221,50 @@ Models with `-preview` suffix use Gemini CLI quota:
|
|
|
213
221
|
"provider": {
|
|
214
222
|
"google": {
|
|
215
223
|
"models": {
|
|
216
|
-
"antigravity-gemini-3-pro
|
|
217
|
-
"name": "Gemini 3 Pro
|
|
224
|
+
"antigravity-gemini-3-pro": {
|
|
225
|
+
"name": "Gemini 3 Pro",
|
|
218
226
|
"limit": { "context": 1048576, "output": 65535 },
|
|
219
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
227
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
228
|
+
"variants": {
|
|
229
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
230
|
+
"medium": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 16384 } } } },
|
|
231
|
+
"high": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
232
|
+
}
|
|
225
233
|
},
|
|
226
234
|
"antigravity-gemini-3-flash": {
|
|
227
|
-
"name": "Gemini 3 Flash
|
|
228
|
-
"limit": { "context": 1048576, "output": 65536 },
|
|
229
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
230
|
-
},
|
|
231
|
-
"gemini-3-pro-low": {
|
|
232
|
-
"name": "Gemini 3 Pro Low (Antigravity)",
|
|
233
|
-
"limit": { "context": 1048576, "output": 65535 },
|
|
234
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
235
|
-
},
|
|
236
|
-
"gemini-3-pro-high": {
|
|
237
|
-
"name": "Gemini 3 Pro High (Antigravity)",
|
|
238
|
-
"limit": { "context": 1048576, "output": 65535 },
|
|
239
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
240
|
-
},
|
|
241
|
-
"gemini-3-flash": {
|
|
242
|
-
"name": "Gemini 3 Flash (Antigravity)",
|
|
235
|
+
"name": "Gemini 3 Flash",
|
|
243
236
|
"limit": { "context": 1048576, "output": 65536 },
|
|
244
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
237
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
238
|
+
"variants": {
|
|
239
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
240
|
+
"medium": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 16384 } } } },
|
|
241
|
+
"high": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
242
|
+
}
|
|
245
243
|
},
|
|
246
244
|
"antigravity-claude-sonnet-4-5": {
|
|
247
|
-
"name": "Claude Sonnet 4.5 (
|
|
245
|
+
"name": "Claude Sonnet 4.5 (no thinking)",
|
|
248
246
|
"limit": { "context": 200000, "output": 64000 },
|
|
249
247
|
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
250
248
|
},
|
|
251
|
-
"antigravity-claude-sonnet-4-5-thinking
|
|
252
|
-
"name": "Claude Sonnet 4.5
|
|
249
|
+
"antigravity-claude-sonnet-4-5-thinking": {
|
|
250
|
+
"name": "Claude Sonnet 4.5 Thinking",
|
|
253
251
|
"limit": { "context": 200000, "output": 64000 },
|
|
254
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
252
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
253
|
+
"variants": {
|
|
254
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
255
|
+
"medium": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 16384 } } } },
|
|
256
|
+
"max": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
257
|
+
}
|
|
255
258
|
},
|
|
256
|
-
"antigravity-claude-
|
|
257
|
-
"name": "Claude
|
|
259
|
+
"antigravity-claude-opus-4-5-thinking": {
|
|
260
|
+
"name": "Claude Opus 4.5 Thinking",
|
|
258
261
|
"limit": { "context": 200000, "output": 64000 },
|
|
259
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
},
|
|
266
|
-
"antigravity-claude-opus-4-5-thinking-low": {
|
|
267
|
-
"name": "Claude Opus 4.5 Think Low (Antigravity)",
|
|
268
|
-
"limit": { "context": 200000, "output": 64000 },
|
|
269
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
270
|
-
},
|
|
271
|
-
"antigravity-claude-opus-4-5-thinking-medium": {
|
|
272
|
-
"name": "Claude Opus 4.5 Think Medium (Antigravity)",
|
|
273
|
-
"limit": { "context": 200000, "output": 64000 },
|
|
274
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
275
|
-
},
|
|
276
|
-
"antigravity-claude-opus-4-5-thinking-high": {
|
|
277
|
-
"name": "Claude Opus 4.5 Think High (Antigravity)",
|
|
278
|
-
"limit": { "context": 200000, "output": 64000 },
|
|
279
|
-
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
|
|
262
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
263
|
+
"variants": {
|
|
264
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
265
|
+
"medium": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 16384 } } } },
|
|
266
|
+
"max": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
267
|
+
}
|
|
280
268
|
},
|
|
281
269
|
"gemini-2.5-flash": {
|
|
282
270
|
"name": "Gemini 2.5 Flash (CLI)",
|
|
@@ -306,6 +294,61 @@ Models with `-preview` suffix use Gemini CLI quota:
|
|
|
306
294
|
|
|
307
295
|
</details>
|
|
308
296
|
|
|
297
|
+
## Model Variants
|
|
298
|
+
|
|
299
|
+
OpenCode's variant system allows you to configure thinking budget dynamically instead of defining separate models for each thinking level.
|
|
300
|
+
|
|
301
|
+
### How Variants Work
|
|
302
|
+
|
|
303
|
+
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.
|
|
304
|
+
|
|
305
|
+
### Variant Configuration
|
|
306
|
+
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"antigravity-claude-sonnet-4-5-thinking": {
|
|
310
|
+
"name": "Claude Sonnet 4.5 Thinking",
|
|
311
|
+
"limit": { "context": 200000, "output": 64000 },
|
|
312
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
313
|
+
"variants": {
|
|
314
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
315
|
+
"medium": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 16384 } } } },
|
|
316
|
+
"max": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Supported Provider Formats
|
|
323
|
+
|
|
324
|
+
The plugin accepts thinking configuration in multiple AI SDK formats:
|
|
325
|
+
|
|
326
|
+
| Format | Structure |
|
|
327
|
+
|--------|-----------|
|
|
328
|
+
| **Google** | `{ google: { thinkingConfig: { thinkingBudget: N } } }` |
|
|
329
|
+
| **Anthropic** | `{ anthropic: { thinking: { type: "enabled", budgetTokens: N } } }` |
|
|
330
|
+
|
|
331
|
+
### Gemini 3 Budget Mapping
|
|
332
|
+
|
|
333
|
+
For Gemini 3 models, thinking budget is automatically mapped to thinking level:
|
|
334
|
+
|
|
335
|
+
| Budget Range | Thinking Level |
|
|
336
|
+
|--------------|----------------|
|
|
337
|
+
| ≤ 8192 | low |
|
|
338
|
+
| ≤ 16384 | medium |
|
|
339
|
+
| > 16384 | high |
|
|
340
|
+
|
|
341
|
+
### Backward Compatibility
|
|
342
|
+
|
|
343
|
+
Legacy tier-suffixed models still work:
|
|
344
|
+
- `antigravity-claude-sonnet-4-5-thinking-low`
|
|
345
|
+
- `antigravity-claude-sonnet-4-5-thinking-medium`
|
|
346
|
+
- `antigravity-claude-sonnet-4-5-thinking-high`
|
|
347
|
+
- `antigravity-gemini-3-pro-low`
|
|
348
|
+
- `antigravity-gemini-3-pro-high`
|
|
349
|
+
|
|
350
|
+
However, **we recommend using variants** for a cleaner model picker and more flexibility.
|
|
351
|
+
|
|
309
352
|
## Multi-Account Setup
|
|
310
353
|
|
|
311
354
|
Add multiple Google accounts for higher combined quotas. The plugin automatically rotates between accounts when one is rate-limited.
|
|
@@ -395,13 +438,37 @@ Create `~/.config/opencode/antigravity.json` (or `.opencode/antigravity.json` in
|
|
|
395
438
|
| `max_rate_limit_wait_seconds` | `300` | Max wait time when rate limited (0=unlimited) |
|
|
396
439
|
| `quota_fallback` | `false` | Try alternate quota when rate limited |
|
|
397
440
|
|
|
441
|
+
### Account Selection
|
|
442
|
+
|
|
443
|
+
| Option | Default | Description |
|
|
444
|
+
|--------|---------|-------------|
|
|
445
|
+
| `account_selection_strategy` | `"sticky"` | Strategy for distributing requests across accounts |
|
|
446
|
+
|
|
447
|
+
**Available strategies:**
|
|
448
|
+
|
|
449
|
+
| Strategy | Behavior | Best For |
|
|
450
|
+
|----------|----------|----------|
|
|
451
|
+
| `sticky` | Same account until rate-limited | Prompt cache preservation |
|
|
452
|
+
| `round-robin` | Rotate to next account on every request | Maximum throughput |
|
|
453
|
+
| `hybrid` | Touch all fresh accounts first, then sticky | Sync reset timers + cache |
|
|
454
|
+
|
|
455
|
+
**Error handling:**
|
|
456
|
+
|
|
457
|
+
| Error Type | Behavior |
|
|
458
|
+
|------------|----------|
|
|
459
|
+
| `MODEL_CAPACITY_EXHAUSTED` | Wait (escalating 5s→60s) and retry same account |
|
|
460
|
+
| `QUOTA_EXCEEDED` | Switch to next available account immediately |
|
|
461
|
+
|
|
462
|
+
This prevents unnecessary account switching when server-side capacity issues affect all accounts equally.
|
|
463
|
+
|
|
398
464
|
### Environment Overrides
|
|
399
465
|
|
|
400
466
|
```bash
|
|
401
|
-
OPENCODE_ANTIGRAVITY_QUIET=1
|
|
402
|
-
OPENCODE_ANTIGRAVITY_DEBUG=1
|
|
403
|
-
OPENCODE_ANTIGRAVITY_LOG_DIR=/path
|
|
404
|
-
OPENCODE_ANTIGRAVITY_KEEP_THINKING=1
|
|
467
|
+
OPENCODE_ANTIGRAVITY_QUIET=1 # quiet_mode
|
|
468
|
+
OPENCODE_ANTIGRAVITY_DEBUG=1 # debug
|
|
469
|
+
OPENCODE_ANTIGRAVITY_LOG_DIR=/path # log_dir
|
|
470
|
+
OPENCODE_ANTIGRAVITY_KEEP_THINKING=1 # keep_thinking
|
|
471
|
+
OPENCODE_ANTIGRAVITY_ACCOUNT_SELECTION_STRATEGY=round-robin # account_selection_strategy
|
|
405
472
|
```
|
|
406
473
|
|
|
407
474
|
<details>
|
|
@@ -409,7 +476,7 @@ OPENCODE_ANTIGRAVITY_KEEP_THINKING=1 # keep_thinking
|
|
|
409
476
|
|
|
410
477
|
```json
|
|
411
478
|
{
|
|
412
|
-
"$schema": "https://raw.githubusercontent.com/
|
|
479
|
+
"$schema": "https://raw.githubusercontent.com/NoeFabris/opencode-antigravity-auth/main/assets/antigravity.schema.json",
|
|
413
480
|
"quiet_mode": false,
|
|
414
481
|
"debug": false,
|
|
415
482
|
"log_dir": "/custom/log/path",
|
|
@@ -427,6 +494,7 @@ OPENCODE_ANTIGRAVITY_KEEP_THINKING=1 # keep_thinking
|
|
|
427
494
|
"proactive_refresh_check_interval_seconds": 300,
|
|
428
495
|
"max_rate_limit_wait_seconds": 300,
|
|
429
496
|
"quota_fallback": false,
|
|
497
|
+
"account_selection_strategy": "sticky",
|
|
430
498
|
"signature_cache": {
|
|
431
499
|
"enabled": true,
|
|
432
500
|
"memory_ttl_seconds": 3600,
|
|
@@ -462,7 +530,53 @@ When spawning parallel subagents, multiple processes may select the same account
|
|
|
462
530
|
- **gemini-auth plugins** - Not needed. This plugin handles all Google OAuth authentication.
|
|
463
531
|
|
|
464
532
|
<details>
|
|
465
|
-
<summary><b>Migration Guide (v1.2.
|
|
533
|
+
<summary><b>Migration Guide (v1.2.8+ - Variants)</b></summary>
|
|
534
|
+
|
|
535
|
+
### What Changed
|
|
536
|
+
|
|
537
|
+
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.
|
|
538
|
+
|
|
539
|
+
### Before (v1.2.7)
|
|
540
|
+
|
|
541
|
+
```json
|
|
542
|
+
{
|
|
543
|
+
"antigravity-claude-sonnet-4-5-thinking-low": { ... },
|
|
544
|
+
"antigravity-claude-sonnet-4-5-thinking-medium": { ... },
|
|
545
|
+
"antigravity-claude-sonnet-4-5-thinking-high": { ... }
|
|
546
|
+
}
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
### After (v1.2.8+)
|
|
550
|
+
|
|
551
|
+
```json
|
|
552
|
+
{
|
|
553
|
+
"antigravity-claude-sonnet-4-5-thinking": {
|
|
554
|
+
"name": "Claude Sonnet 4.5 Thinking",
|
|
555
|
+
"limit": { "context": 200000, "output": 64000 },
|
|
556
|
+
"modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
|
|
557
|
+
"variants": {
|
|
558
|
+
"low": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 8192 } } } },
|
|
559
|
+
"medium": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 16384 } } } },
|
|
560
|
+
"max": { "providerOptions": { "google": { "thinkingConfig": { "thinkingBudget": 32768 } } } }
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
### Benefits
|
|
567
|
+
|
|
568
|
+
- **Cleaner model picker** - 4 models instead of 12+
|
|
569
|
+
- **Flexible budgets** - Define any budget, not just low/medium/high
|
|
570
|
+
- **Future-proof** - Works with OpenCode's native variant system
|
|
571
|
+
|
|
572
|
+
### Backward Compatibility
|
|
573
|
+
|
|
574
|
+
Old tier-suffixed models (`antigravity-claude-sonnet-4-5-thinking-low`, etc.) still work. No action required if you prefer the old style.
|
|
575
|
+
|
|
576
|
+
</details>
|
|
577
|
+
|
|
578
|
+
<details>
|
|
579
|
+
<summary><b>Migration Guide (v1.2.7 - Prefix)</b></summary>
|
|
466
580
|
|
|
467
581
|
If upgrading from v1.2.6 or earlier:
|
|
468
582
|
|
|
@@ -472,9 +586,7 @@ v1.2.7+ uses explicit prefixes to distinguish quota sources:
|
|
|
472
586
|
|
|
473
587
|
| Model Type | New Name (Recommended) | Old Name (Still Works) |
|
|
474
588
|
|------------|------------------------|------------------------|
|
|
475
|
-
| Gemini 3 (Antigravity) | `antigravity-gemini-3-pro
|
|
476
|
-
| Gemini 3 (Antigravity) | `antigravity-gemini-3-pro-high` | `gemini-3-pro-high` |
|
|
477
|
-
| Gemini 3 (Antigravity) | `antigravity-gemini-3-flash` | `gemini-3-flash` |
|
|
589
|
+
| Gemini 3 (Antigravity) | `antigravity-gemini-3-pro` | `gemini-3-pro-low` |
|
|
478
590
|
| Gemini 3 (CLI) | `gemini-3-pro-preview` | N/A |
|
|
479
591
|
| Claude | `antigravity-claude-sonnet-4-5` | `claude-sonnet-4-5` |
|
|
480
592
|
|
|
@@ -484,7 +596,7 @@ v1.2.7+ uses explicit prefixes to distinguish quota sources:
|
|
|
484
596
|
|
|
485
597
|
```diff
|
|
486
598
|
- "gemini-3-pro-low": { ... }
|
|
487
|
-
+ "antigravity-gemini-3-pro
|
|
599
|
+
+ "antigravity-gemini-3-pro": { ... }
|
|
488
600
|
```
|
|
489
601
|
|
|
490
602
|
> **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.
|
|
@@ -504,7 +616,7 @@ Models now use `antigravity-` prefix for Antigravity quota. See [Available Model
|
|
|
504
616
|
|
|
505
617
|
```json
|
|
506
618
|
{
|
|
507
|
-
"$schema": "https://raw.githubusercontent.com/
|
|
619
|
+
"$schema": "https://raw.githubusercontent.com/NoeFabris/opencode-antigravity-auth/main/assets/antigravity.schema.json",
|
|
508
620
|
"quiet_mode": false,
|
|
509
621
|
"debug": false
|
|
510
622
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type AccountStorageV3, type RateLimitStateV3, type ModelFamily, type HeaderStyle, type CooldownReason } from "./storage";
|
|
2
2
|
import type { OAuthAuthDetails, RefreshParts } from "./types";
|
|
3
|
+
import type { AccountSelectionStrategy } from "./config/schema";
|
|
3
4
|
export type { ModelFamily, HeaderStyle, CooldownReason } from "./storage";
|
|
5
|
+
export type { AccountSelectionStrategy } from "./config/schema";
|
|
4
6
|
export type BaseQuotaKey = "claude" | "gemini-antigravity" | "gemini-cli";
|
|
5
7
|
export type QuotaKey = BaseQuotaKey | `${BaseQuotaKey}:${string}`;
|
|
6
8
|
export interface ManagedAccount {
|
|
@@ -15,6 +17,8 @@ export interface ManagedAccount {
|
|
|
15
17
|
lastSwitchReason?: "rate-limit" | "initial" | "rotation";
|
|
16
18
|
coolingDownUntil?: number;
|
|
17
19
|
cooldownReason?: CooldownReason;
|
|
20
|
+
touchedForQuota: Record<string, number>;
|
|
21
|
+
consecutiveFailures?: number;
|
|
18
22
|
}
|
|
19
23
|
/**
|
|
20
24
|
* In-memory multi-account manager with sticky account selection.
|
|
@@ -29,6 +33,7 @@ export declare class AccountManager {
|
|
|
29
33
|
private accounts;
|
|
30
34
|
private cursor;
|
|
31
35
|
private currentAccountIndexByFamily;
|
|
36
|
+
private sessionOffsetApplied;
|
|
32
37
|
private lastToastAccountIndex;
|
|
33
38
|
private lastToastTime;
|
|
34
39
|
static loadFromDisk(authFallback?: OAuthAuthDetails): Promise<AccountManager>;
|
|
@@ -39,13 +44,16 @@ export declare class AccountManager {
|
|
|
39
44
|
markSwitched(account: ManagedAccount, reason: "rate-limit" | "initial" | "rotation", family: ModelFamily): void;
|
|
40
45
|
shouldShowAccountToast(accountIndex: number, debounceMs?: number): boolean;
|
|
41
46
|
markToastShown(accountIndex: number): void;
|
|
42
|
-
getCurrentOrNextForFamily(family: ModelFamily, model?: string | null): ManagedAccount | null;
|
|
47
|
+
getCurrentOrNextForFamily(family: ModelFamily, model?: string | null, strategy?: AccountSelectionStrategy, headerStyle?: HeaderStyle): ManagedAccount | null;
|
|
43
48
|
getNextForFamily(family: ModelFamily, model?: string | null): ManagedAccount | null;
|
|
44
49
|
markRateLimited(account: ManagedAccount, retryAfterMs: number, family: ModelFamily, headerStyle?: HeaderStyle, model?: string | null): void;
|
|
45
50
|
markAccountCoolingDown(account: ManagedAccount, cooldownMs: number, reason: CooldownReason): void;
|
|
46
51
|
isAccountCoolingDown(account: ManagedAccount): boolean;
|
|
47
52
|
clearAccountCooldown(account: ManagedAccount): void;
|
|
48
53
|
getAccountCooldownReason(account: ManagedAccount): CooldownReason | undefined;
|
|
54
|
+
markTouchedForQuota(account: ManagedAccount, quotaKey: string): void;
|
|
55
|
+
isFreshForQuota(account: ManagedAccount, quotaKey: string): boolean;
|
|
56
|
+
getFreshAccountsForQuota(quotaKey: string, family: ModelFamily, model?: string | null): ManagedAccount[];
|
|
49
57
|
isRateLimitedForHeaderStyle(account: ManagedAccount, family: ModelFamily, headerStyle: HeaderStyle, model?: string | null): boolean;
|
|
50
58
|
getAvailableHeaderStyle(account: ManagedAccount, family: ModelFamily, model?: string | null): HeaderStyle | null;
|
|
51
59
|
removeAccount(account: ManagedAccount): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/plugin/accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAC9J,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/plugin/accounts.ts"],"names":[],"mappings":"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"}
|