opencode-antigravity-auth 1.2.8-beta.1 → 1.2.8-beta.3

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.
Files changed (45) hide show
  1. package/README.md +254 -132
  2. package/dist/src/plugin/accounts.d.ts +9 -1
  3. package/dist/src/plugin/accounts.d.ts.map +1 -1
  4. package/dist/src/plugin/accounts.js +59 -1
  5. package/dist/src/plugin/accounts.js.map +1 -1
  6. package/dist/src/plugin/config/loader.d.ts.map +1 -1
  7. package/dist/src/plugin/config/loader.js +10 -1
  8. package/dist/src/plugin/config/loader.js.map +1 -1
  9. package/dist/src/plugin/config/schema.d.ts +32 -0
  10. package/dist/src/plugin/config/schema.d.ts.map +1 -1
  11. package/dist/src/plugin/config/schema.js +29 -0
  12. package/dist/src/plugin/config/schema.js.map +1 -1
  13. package/dist/src/plugin/core/streaming/transformer.d.ts +2 -1
  14. package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -1
  15. package/dist/src/plugin/core/streaming/transformer.js +98 -4
  16. package/dist/src/plugin/core/streaming/transformer.js.map +1 -1
  17. package/dist/src/plugin/core/streaming/types.d.ts +1 -0
  18. package/dist/src/plugin/core/streaming/types.d.ts.map +1 -1
  19. package/dist/src/plugin/request-helpers.d.ts +22 -17
  20. package/dist/src/plugin/request-helpers.d.ts.map +1 -1
  21. package/dist/src/plugin/request-helpers.js +100 -25
  22. package/dist/src/plugin/request-helpers.js.map +1 -1
  23. package/dist/src/plugin/request.d.ts.map +1 -1
  24. package/dist/src/plugin/request.js +80 -16
  25. package/dist/src/plugin/request.js.map +1 -1
  26. package/dist/src/plugin/storage.d.ts.map +1 -1
  27. package/dist/src/plugin/storage.js +104 -3
  28. package/dist/src/plugin/storage.js.map +1 -1
  29. package/dist/src/plugin/transform/gemini.d.ts.map +1 -1
  30. package/dist/src/plugin/transform/gemini.js +22 -3
  31. package/dist/src/plugin/transform/gemini.js.map +1 -1
  32. package/dist/src/plugin/transform/index.d.ts +2 -1
  33. package/dist/src/plugin/transform/index.d.ts.map +1 -1
  34. package/dist/src/plugin/transform/index.js +1 -1
  35. package/dist/src/plugin/transform/index.js.map +1 -1
  36. package/dist/src/plugin/transform/model-resolver.d.ts +14 -3
  37. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -1
  38. package/dist/src/plugin/transform/model-resolver.js +74 -16
  39. package/dist/src/plugin/transform/model-resolver.js.map +1 -1
  40. package/dist/src/plugin/transform/types.d.ts +2 -0
  41. package/dist/src/plugin/transform/types.d.ts.map +1 -1
  42. package/dist/src/plugin.d.ts.map +1 -1
  43. package/dist/src/plugin.js +17 -13
  44. package/dist/src/plugin.js.map +1 -1
  45. package/package.json +3 -1
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![npm beta](https://img.shields.io/npm/v/opencode-antigravity-auth/beta.svg?label=beta)](https://www.npmjs.com/package/opencode-antigravity-auth)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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-high` and `claude-opus-4-5-thinking` with your Google credentials.
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.)
@@ -52,11 +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 (Antigravity)",
57
- "limit": { "context": 200000, "output": 64000 },
58
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
59
- }
56
+ "antigravity-claude-sonnet-4-5-thinking": {
57
+ "name": "Claude Sonnet 4.5 Thinking",
58
+ "limit": { "context": 200000, "output": 64000 },
59
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
60
+ "variants": {
61
+ "low": { "thinkingConfig": { "thinkingBudget": 8192 } },
62
+ "max": { "thinkingConfig": { "thinkingBudget": 32768 } }
63
+ }
64
+ }
60
65
  }
61
66
  }
62
67
  }
@@ -66,7 +71,7 @@ Install the opencode-antigravity-auth plugin and add the Antigravity model defin
66
71
  4. **Use it:**
67
72
 
68
73
  ```bash
69
- opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5
74
+ opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5-thinking --variant=max
70
75
  ```
71
76
 
72
77
  <details>
@@ -92,69 +97,67 @@ Create `~/.config/opencode/opencode.json`:
92
97
  "provider": {
93
98
  "google": {
94
99
  "models": {
95
- "antigravity-gemini-3-pro-low": {
96
- "name": "Gemini 3 Pro Low (Antigravity)",
100
+ "antigravity-gemini-3-pro": {
101
+ "name": "Gemini 3 Pro (Antigravity)",
97
102
  "limit": { "context": 1048576, "output": 65535 },
98
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
99
- },
100
- "antigravity-gemini-3-pro-high": {
101
- "name": "Gemini 3 Pro High (Antigravity)",
102
- "limit": { "context": 1048576, "output": 65535 },
103
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
103
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
104
+ "variants": {
105
+ "low": { "thinkingLevel": "low" },
106
+ "high": { "thinkingLevel": "high" }
107
+ }
104
108
  },
105
109
  "antigravity-gemini-3-flash": {
106
110
  "name": "Gemini 3 Flash (Antigravity)",
107
111
  "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)",
122
- "limit": { "context": 1048576, "output": 65536 },
123
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
112
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
113
+ "variants": {
114
+ "minimal": { "thinkingLevel": "minimal" },
115
+ "low": { "thinkingLevel": "low" },
116
+ "medium": { "thinkingLevel": "medium" },
117
+ "high": { "thinkingLevel": "high" }
118
+ }
124
119
  },
125
120
  "antigravity-claude-sonnet-4-5": {
126
121
  "name": "Claude Sonnet 4.5 (Antigravity)",
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-low": {
131
- "name": "Claude Sonnet 4.5 Think Low (Antigravity)",
125
+ "antigravity-claude-sonnet-4-5-thinking": {
126
+ "name": "Claude Sonnet 4.5 Thinking (Antigravity)",
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": { "thinkingConfig": { "thinkingBudget": 8192 } },
131
+ "max": { "thinkingConfig": { "thinkingBudget": 32768 } }
132
+ }
134
133
  },
135
- "antigravity-claude-sonnet-4-5-thinking-medium": {
136
- "name": "Claude Sonnet 4.5 Think Medium (Antigravity)",
134
+ "antigravity-claude-opus-4-5-thinking": {
135
+ "name": "Claude Opus 4.5 Thinking (Antigravity)",
137
136
  "limit": { "context": 200000, "output": 64000 },
138
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
137
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
138
+ "variants": {
139
+ "low": { "thinkingConfig": { "thinkingBudget": 8192 } },
140
+ "max": { "thinkingConfig": { "thinkingBudget": 32768 } }
141
+ }
139
142
  },
140
- "antigravity-claude-sonnet-4-5-thinking-high": {
141
- "name": "Claude Sonnet 4.5 Think High (Antigravity)",
142
- "limit": { "context": 200000, "output": 64000 },
143
+ "gemini-2.5-flash": {
144
+ "name": "Gemini 2.5 Flash (Gemini CLI)",
145
+ "limit": { "context": 1048576, "output": 65536 },
143
146
  "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
144
147
  },
145
- "antigravity-claude-opus-4-5-thinking-low": {
146
- "name": "Claude Opus 4.5 Think Low (Antigravity)",
147
- "limit": { "context": 200000, "output": 64000 },
148
+ "gemini-2.5-pro": {
149
+ "name": "Gemini 2.5 Pro (Gemini CLI)",
150
+ "limit": { "context": 1048576, "output": 65536 },
148
151
  "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
149
152
  },
150
- "antigravity-claude-opus-4-5-thinking-medium": {
151
- "name": "Claude Opus 4.5 Think Medium (Antigravity)",
152
- "limit": { "context": 200000, "output": 64000 },
153
+ "gemini-3-flash-preview": {
154
+ "name": "Gemini 3 Flash Preview (Gemini CLI)",
155
+ "limit": { "context": 1048576, "output": 65536 },
153
156
  "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
154
157
  },
155
- "antigravity-claude-opus-4-5-thinking-high": {
156
- "name": "Claude Opus 4.5 Think High (Antigravity)",
157
- "limit": { "context": 200000, "output": 64000 },
158
+ "gemini-3-pro-preview": {
159
+ "name": "Gemini 3 Pro Preview (Gemini CLI)",
160
+ "limit": { "context": 1048576, "output": 65535 },
158
161
  "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
159
162
  }
160
163
  }
@@ -166,31 +169,33 @@ Create `~/.config/opencode/opencode.json`:
166
169
  ### Verification
167
170
 
168
171
  ```bash
169
- opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5
172
+ opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5-thinking --variant=max
170
173
  ```
171
174
 
172
175
  </details>
173
176
 
174
177
  ## Available Models
175
178
 
176
- ### Antigravity Quota
179
+ ### Antigravity Quota (with Variants)
177
180
 
178
- Models with `antigravity-` prefix use Antigravity quota:
181
+ Models with `antigravity-` prefix use Antigravity quota. **Thinking models support variants** for dynamic thinking budget configuration:
179
182
 
180
- | Model | Description |
181
- |-------|-------------|
182
- | `google/antigravity-gemini-3-flash` | Gemini 3 Flash (minimal thinking) |
183
- | `google/antigravity-gemini-3-pro-low` | Gemini 3 Pro with low thinking |
184
- | `google/antigravity-gemini-3-pro-high` | Gemini 3 Pro with high thinking |
185
- | `google/antigravity-claude-sonnet-4-5` | Claude Sonnet 4.5 (no thinking) |
186
- | `google/antigravity-claude-sonnet-4-5-thinking-low` | Sonnet with 8K thinking budget |
187
- | `google/antigravity-claude-sonnet-4-5-thinking-medium` | Sonnet with 16K thinking budget |
188
- | `google/antigravity-claude-sonnet-4-5-thinking-high` | Sonnet with 32K thinking budget |
189
- | `google/antigravity-claude-opus-4-5-thinking-low` | Opus with 8K thinking budget |
190
- | `google/antigravity-claude-opus-4-5-thinking-medium` | Opus with 16K thinking budget |
191
- | `google/antigravity-claude-opus-4-5-thinking-high` | Opus with 32K thinking budget |
192
-
193
- > **Backward compatibility:** Old model names (`gemini-3-pro-low`, `gemini-3-pro-high`, `gemini-3-flash`) still work as a fallback. However, you should update to the `antigravity-` prefix for stability. See [Migration Guide](#migration-guide-v127).
183
+ | Model | Variants | Description |
184
+ |-------|----------|-------------|
185
+ | `google/antigravity-gemini-3-pro` | low, high | Gemini 3 Pro with configurable thinking |
186
+ | `google/antigravity-gemini-3-flash` | minimal, low, medium, high | Gemini 3 Flash with configurable thinking |
187
+ | `google/antigravity-claude-sonnet-4-5` | - | Claude Sonnet 4.5 (no thinking) |
188
+ | `google/antigravity-claude-sonnet-4-5-thinking` | low, max | Claude Sonnet with configurable thinking |
189
+ | `google/antigravity-claude-opus-4-5-thinking` | low, max | Claude Opus with configurable thinking |
190
+
191
+ **Variant configuration:**
192
+ - **Gemini 3**: Uses `thinkingLevel` string (`"low"`, `"medium"`, `"high"`)
193
+ - **Claude**: Uses `thinkingBudget` number (8192, 32768 tokens)
194
+
195
+ **Usage:**
196
+ ```bash
197
+ opencode run "Hello" --model=google/antigravity-claude-sonnet-4-5-thinking --variant=max
198
+ ```
194
199
 
195
200
  ### Gemini CLI Quota
196
201
 
@@ -204,7 +209,7 @@ Models with `-preview` suffix use Gemini CLI quota:
204
209
  | `google/gemini-3-pro-preview` | Gemini 3 Pro (preview) |
205
210
 
206
211
  <details>
207
- <summary><b>Full models configuration</b></summary>
212
+ <summary><b>Full models configuration (copy-paste ready)</b></summary>
208
213
 
209
214
  ```json
210
215
  {
@@ -213,88 +218,66 @@ Models with `-preview` suffix use Gemini CLI quota:
213
218
  "provider": {
214
219
  "google": {
215
220
  "models": {
216
- "antigravity-gemini-3-pro-low": {
217
- "name": "Gemini 3 Pro Low (Antigravity)",
221
+ "antigravity-gemini-3-pro": {
222
+ "name": "Gemini 3 Pro (Antigravity)",
218
223
  "limit": { "context": 1048576, "output": 65535 },
219
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
220
- },
221
- "antigravity-gemini-3-pro-high": {
222
- "name": "Gemini 3 Pro High (Antigravity)",
223
- "limit": { "context": 1048576, "output": 65535 },
224
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
224
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
225
+ "variants": {
226
+ "low": { "thinkingLevel": "low" },
227
+ "high": { "thinkingLevel": "high" }
228
+ }
225
229
  },
226
230
  "antigravity-gemini-3-flash": {
227
231
  "name": "Gemini 3 Flash (Antigravity)",
228
232
  "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)",
243
- "limit": { "context": 1048576, "output": 65536 },
244
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
233
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
234
+ "variants": {
235
+ "minimal": { "thinkingLevel": "minimal" },
236
+ "low": { "thinkingLevel": "low" },
237
+ "medium": { "thinkingLevel": "medium" },
238
+ "high": { "thinkingLevel": "high" }
239
+ }
245
240
  },
246
241
  "antigravity-claude-sonnet-4-5": {
247
- "name": "Claude Sonnet 4.5 (Antigravity)",
248
- "limit": { "context": 200000, "output": 64000 },
249
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
250
- },
251
- "antigravity-claude-sonnet-4-5-thinking-low": {
252
- "name": "Claude Sonnet 4.5 Think Low (Antigravity)",
253
- "limit": { "context": 200000, "output": 64000 },
254
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
255
- },
256
- "antigravity-claude-sonnet-4-5-thinking-medium": {
257
- "name": "Claude Sonnet 4.5 Think Medium (Antigravity)",
258
- "limit": { "context": 200000, "output": 64000 },
259
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
260
- },
261
- "antigravity-claude-sonnet-4-5-thinking-high": {
262
- "name": "Claude Sonnet 4.5 Think High (Antigravity)",
263
- "limit": { "context": 200000, "output": 64000 },
264
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
265
- },
266
- "antigravity-claude-opus-4-5-thinking-low": {
267
- "name": "Claude Opus 4.5 Think Low (Antigravity)",
242
+ "name": "Claude Sonnet 4.5 (no thinking) (Antigravity)",
268
243
  "limit": { "context": 200000, "output": 64000 },
269
244
  "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
270
245
  },
271
- "antigravity-claude-opus-4-5-thinking-medium": {
272
- "name": "Claude Opus 4.5 Think Medium (Antigravity)",
246
+ "antigravity-claude-sonnet-4-5-thinking": {
247
+ "name": "Claude Sonnet 4.5 Thinking (Antigravity)",
273
248
  "limit": { "context": 200000, "output": 64000 },
274
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
249
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
250
+ "variants": {
251
+ "low": { "thinkingConfig": { "thinkingBudget": 8192 } },
252
+ "max": { "thinkingConfig": { "thinkingBudget": 32768 } }
253
+ }
275
254
  },
276
- "antigravity-claude-opus-4-5-thinking-high": {
277
- "name": "Claude Opus 4.5 Think High (Antigravity)",
255
+ "antigravity-claude-opus-4-5-thinking": {
256
+ "name": "Claude Opus 4.5 Thinking (Antigravity)",
278
257
  "limit": { "context": 200000, "output": 64000 },
279
- "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
258
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
259
+ "variants": {
260
+ "low": { "thinkingConfig": { "thinkingBudget": 8192 } },
261
+ "max": { "thinkingConfig": { "thinkingBudget": 32768 } }
262
+ }
280
263
  },
281
264
  "gemini-2.5-flash": {
282
- "name": "Gemini 2.5 Flash (CLI)",
265
+ "name": "Gemini 2.5 Flash (Gemini CLI)",
283
266
  "limit": { "context": 1048576, "output": 65536 },
284
267
  "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
285
268
  },
286
269
  "gemini-2.5-pro": {
287
- "name": "Gemini 2.5 Pro (CLI)",
270
+ "name": "Gemini 2.5 Pro (Gemini CLI)",
288
271
  "limit": { "context": 1048576, "output": 65536 },
289
272
  "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
290
273
  },
291
274
  "gemini-3-flash-preview": {
292
- "name": "Gemini 3 Flash Preview (CLI)",
275
+ "name": "Gemini 3 Flash Preview (Gemini CLI)",
293
276
  "limit": { "context": 1048576, "output": 65536 },
294
277
  "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
295
278
  },
296
279
  "gemini-3-pro-preview": {
297
- "name": "Gemini 3 Pro Preview (CLI)",
280
+ "name": "Gemini 3 Pro Preview (Gemini CLI)",
298
281
  "limit": { "context": 1048576, "output": 65535 },
299
282
  "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }
300
283
  }
@@ -306,6 +289,74 @@ Models with `-preview` suffix use Gemini CLI quota:
306
289
 
307
290
  </details>
308
291
 
292
+ ## Model Variants
293
+
294
+ OpenCode's variant system allows you to configure thinking budget dynamically instead of defining separate models for each thinking level.
295
+
296
+ ### How Variants Work
297
+
298
+ 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.
299
+
300
+ ### Variant Configuration
301
+
302
+ ```json
303
+ {
304
+ "antigravity-claude-sonnet-4-5-thinking": {
305
+ "name": "Claude Sonnet 4.5 Thinking",
306
+ "limit": { "context": 200000, "output": 64000 },
307
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
308
+ "variants": {
309
+ "low": { "thinkingConfig": { "thinkingBudget": 8192 } },
310
+ "max": { "thinkingConfig": { "thinkingBudget": 32768 } }
311
+ }
312
+ }
313
+ }
314
+ ```
315
+
316
+ ### Supported Variant Formats
317
+
318
+ The plugin accepts different variant formats depending on the model family:
319
+
320
+ | Model Family | Variant Format |
321
+ |--------------|----------------|
322
+ | **Gemini 3** | `{ "thinkingLevel": "low" \| "medium" \| "high" }` |
323
+ | **Claude** | `{ "thinkingConfig": { "thinkingBudget": N } }` |
324
+ | **Gemini 2.5** | `{ "thinkingConfig": { "thinkingBudget": N } }` |
325
+
326
+ ### Gemini 3 Thinking Levels
327
+
328
+ Gemini 3 models use string-based thinking levels. Available levels differ by model:
329
+
330
+ | Level | Flash | Pro | Description |
331
+ |-------|-------|-----|-------------|
332
+ | `minimal` | Yes | No | Minimal thinking, lowest latency |
333
+ | `low` | Yes | Yes | Light thinking |
334
+ | `medium` | Yes | No | Balanced thinking |
335
+ | `high` | Yes | Yes | Maximum thinking (default for both Pro and Flash) |
336
+
337
+ > **Note:** The API will reject invalid levels (e.g., `"minimal"` on Pro). Configure variants accordingly.
338
+
339
+ ### Legacy Budget Format (Deprecated)
340
+
341
+ For Gemini 3 models, the old `thinkingBudget` format is still supported but deprecated:
342
+
343
+ | Budget Range | Maps to Level |
344
+ |--------------|---------------|
345
+ | ≤ 8192 | low |
346
+ | ≤ 16384 | medium |
347
+ | > 16384 | high |
348
+
349
+ ### Backward Compatibility
350
+
351
+ Legacy tier-suffixed models still work:
352
+ - `antigravity-claude-sonnet-4-5-thinking-low`
353
+ - `antigravity-claude-sonnet-4-5-thinking-medium`
354
+ - `antigravity-claude-sonnet-4-5-thinking-high`
355
+ - `antigravity-gemini-3-pro-low`
356
+ - `antigravity-gemini-3-pro-high`
357
+
358
+ However, **we recommend using variants** for a cleaner model picker and more flexibility.
359
+
309
360
  ## Multi-Account Setup
310
361
 
311
362
  Add multiple Google accounts for higher combined quotas. The plugin automatically rotates between accounts when one is rate-limited.
@@ -395,13 +446,39 @@ Create `~/.config/opencode/antigravity.json` (or `.opencode/antigravity.json` in
395
446
  | `max_rate_limit_wait_seconds` | `300` | Max wait time when rate limited (0=unlimited) |
396
447
  | `quota_fallback` | `false` | Try alternate quota when rate limited |
397
448
 
449
+ ### Account Selection
450
+
451
+ | Option | Default | Description |
452
+ |--------|---------|-------------|
453
+ | `account_selection_strategy` | `"sticky"` | Strategy for distributing requests across accounts |
454
+ | `pid_offset_enabled` | `false` | Use PID-based offset for multi-session distribution |
455
+
456
+ **Available strategies:**
457
+
458
+ | Strategy | Behavior | Best For |
459
+ |----------|----------|----------|
460
+ | `sticky` | Same account until rate-limited | Prompt cache preservation |
461
+ | `round-robin` | Rotate to next account on every request | Maximum throughput |
462
+ | `hybrid` | Touch all fresh accounts first, then sticky | Sync reset timers + cache |
463
+
464
+ **Error handling:**
465
+
466
+ | Error Type | Behavior |
467
+ |------------|----------|
468
+ | `MODEL_CAPACITY_EXHAUSTED` | Wait (escalating 5s→60s) and retry same account |
469
+ | `QUOTA_EXCEEDED` | Switch to next available account immediately |
470
+
471
+ This prevents unnecessary account switching when server-side capacity issues affect all accounts equally.
472
+
398
473
  ### Environment Overrides
399
474
 
400
475
  ```bash
401
- OPENCODE_ANTIGRAVITY_QUIET=1 # quiet_mode
402
- OPENCODE_ANTIGRAVITY_DEBUG=1 # debug
403
- OPENCODE_ANTIGRAVITY_LOG_DIR=/path # log_dir
404
- OPENCODE_ANTIGRAVITY_KEEP_THINKING=1 # keep_thinking
476
+ OPENCODE_ANTIGRAVITY_QUIET=1 # quiet_mode
477
+ OPENCODE_ANTIGRAVITY_DEBUG=1 # debug
478
+ OPENCODE_ANTIGRAVITY_LOG_DIR=/path # log_dir
479
+ OPENCODE_ANTIGRAVITY_KEEP_THINKING=1 # keep_thinking
480
+ OPENCODE_ANTIGRAVITY_ACCOUNT_SELECTION_STRATEGY=round-robin # account_selection_strategy
481
+ OPENCODE_ANTIGRAVITY_PID_OFFSET_ENABLED=1 # pid_offset_enabled
405
482
  ```
406
483
 
407
484
  <details>
@@ -427,6 +504,8 @@ OPENCODE_ANTIGRAVITY_KEEP_THINKING=1 # keep_thinking
427
504
  "proactive_refresh_check_interval_seconds": 300,
428
505
  "max_rate_limit_wait_seconds": 300,
429
506
  "quota_fallback": false,
507
+ "account_selection_strategy": "sticky",
508
+ "pid_offset_enabled": false,
430
509
  "signature_cache": {
431
510
  "enabled": true,
432
511
  "memory_ttl_seconds": 3600,
@@ -455,14 +534,59 @@ DCP creates synthetic assistant messages that lack thinking blocks. **Our plugin
455
534
 
456
535
  ### oh-my-opencode
457
536
 
458
- When spawning parallel subagents, multiple processes may select the same account causing rate limit errors. **Workaround:** Add more accounts via `opencode auth login`.
537
+ 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`.
459
538
 
460
539
  ### Plugins You Don't Need
461
540
 
462
541
  - **gemini-auth plugins** - Not needed. This plugin handles all Google OAuth authentication.
463
542
 
464
543
  <details>
465
- <summary><b>Migration Guide (v1.2.7+)</b></summary>
544
+ <summary><b>Migration Guide (v1.2.8+ - Variants)</b></summary>
545
+
546
+ ### What Changed
547
+
548
+ 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.
549
+
550
+ ### Before (v1.2.7)
551
+
552
+ ```json
553
+ {
554
+ "antigravity-claude-sonnet-4-5-thinking-low": { ... },
555
+ "antigravity-claude-sonnet-4-5-thinking-medium": { ... },
556
+ "antigravity-claude-sonnet-4-5-thinking-high": { ... }
557
+ }
558
+ ```
559
+
560
+ ### After (v1.2.8+)
561
+
562
+ ```json
563
+ {
564
+ "antigravity-claude-sonnet-4-5-thinking": {
565
+ "name": "Claude Sonnet 4.5 Thinking",
566
+ "limit": { "context": 200000, "output": 64000 },
567
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
568
+ "variants": {
569
+ "low": { "thinkingConfig": { "thinkingBudget": 8192 } },
570
+ "max": { "thinkingConfig": { "thinkingBudget": 32768 } }
571
+ }
572
+ }
573
+ }
574
+ ```
575
+
576
+ ### Benefits
577
+
578
+ - **Cleaner model picker** - 4 models instead of 12+
579
+ - **Flexible budgets** - Define any budget, not just low/max
580
+ - **Future-proof** - Works with OpenCode's native variant system
581
+
582
+ ### Backward Compatibility
583
+
584
+ Old tier-suffixed models (`antigravity-claude-sonnet-4-5-thinking-low`, etc.) still work. No action required if you prefer the old style.
585
+
586
+ </details>
587
+
588
+ <details>
589
+ <summary><b>Migration Guide (v1.2.7 - Prefix)</b></summary>
466
590
 
467
591
  If upgrading from v1.2.6 or earlier:
468
592
 
@@ -472,9 +596,7 @@ v1.2.7+ uses explicit prefixes to distinguish quota sources:
472
596
 
473
597
  | Model Type | New Name (Recommended) | Old Name (Still Works) |
474
598
  |------------|------------------------|------------------------|
475
- | Gemini 3 (Antigravity) | `antigravity-gemini-3-pro-low` | `gemini-3-pro-low` |
476
- | Gemini 3 (Antigravity) | `antigravity-gemini-3-pro-high` | `gemini-3-pro-high` |
477
- | Gemini 3 (Antigravity) | `antigravity-gemini-3-flash` | `gemini-3-flash` |
599
+ | Gemini 3 (Antigravity) | `antigravity-gemini-3-pro` | `gemini-3-pro-low` |
478
600
  | Gemini 3 (CLI) | `gemini-3-pro-preview` | N/A |
479
601
  | Claude | `antigravity-claude-sonnet-4-5` | `claude-sonnet-4-5` |
480
602
 
@@ -484,7 +606,7 @@ v1.2.7+ uses explicit prefixes to distinguish quota sources:
484
606
 
485
607
  ```diff
486
608
  - "gemini-3-pro-low": { ... }
487
- + "antigravity-gemini-3-pro-low": { ... }
609
+ + "antigravity-gemini-3-pro": { ... }
488
610
  ```
489
611
 
490
612
  > **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.
@@ -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, pidOffsetEnabled?: boolean): 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":"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"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/plugin/accounts.ts"],"names":[],"mappings":"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"}