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.
Files changed (39) hide show
  1. package/README.md +243 -131
  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 +81 -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 +5 -1
  8. package/dist/src/plugin/config/loader.js.map +1 -1
  9. package/dist/src/plugin/config/schema.d.ts +17 -0
  10. package/dist/src/plugin/config/schema.d.ts.map +1 -1
  11. package/dist/src/plugin/config/schema.js +15 -0
  12. package/dist/src/plugin/config/schema.js.map +1 -1
  13. package/dist/src/plugin/recovery.d.ts.map +1 -1
  14. package/dist/src/plugin/recovery.js +0 -1
  15. package/dist/src/plugin/recovery.js.map +1 -1
  16. package/dist/src/plugin/request-helpers.d.ts +7 -0
  17. package/dist/src/plugin/request-helpers.d.ts.map +1 -1
  18. package/dist/src/plugin/request-helpers.js +36 -0
  19. package/dist/src/plugin/request-helpers.js.map +1 -1
  20. package/dist/src/plugin/request.d.ts.map +1 -1
  21. package/dist/src/plugin/request.js +18 -5
  22. package/dist/src/plugin/request.js.map +1 -1
  23. package/dist/src/plugin/storage.d.ts.map +1 -1
  24. package/dist/src/plugin/storage.js +104 -3
  25. package/dist/src/plugin/storage.js.map +1 -1
  26. package/dist/src/plugin/transform/index.d.ts +2 -1
  27. package/dist/src/plugin/transform/index.d.ts.map +1 -1
  28. package/dist/src/plugin/transform/index.js +1 -1
  29. package/dist/src/plugin/transform/index.js.map +1 -1
  30. package/dist/src/plugin/transform/model-resolver.d.ts +11 -0
  31. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -1
  32. package/dist/src/plugin/transform/model-resolver.js +36 -0
  33. package/dist/src/plugin/transform/model-resolver.js.map +1 -1
  34. package/dist/src/plugin/transform/types.d.ts +2 -0
  35. package/dist/src/plugin/transform/types.d.ts.map +1 -1
  36. package/dist/src/plugin.d.ts.map +1 -1
  37. package/dist/src/plugin.js +21 -28
  38. package/dist/src/plugin.js.map +1 -1
  39. 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.)
@@ -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/anthropics/opencode-antigravity-auth/dev/README.md
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 (Antigravity)",
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-low": {
96
- "name": "Gemini 3 Pro Low (Antigravity)",
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
- "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"] }
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 (Antigravity)",
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 (Antigravity)",
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-low": {
131
- "name": "Claude Sonnet 4.5 Think Low (Antigravity)",
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-sonnet-4-5-thinking-medium": {
136
- "name": "Claude Sonnet 4.5 Think Medium (Antigravity)",
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
- "antigravity-claude-sonnet-4-5-thinking-high": {
141
- "name": "Claude Sonnet 4.5 Think High (Antigravity)",
142
- "limit": { "context": 200000, "output": 64000 },
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
- "antigravity-claude-opus-4-5-thinking-low": {
146
- "name": "Claude Opus 4.5 Think Low (Antigravity)",
147
- "limit": { "context": 200000, "output": 64000 },
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
- "antigravity-claude-opus-4-5-thinking-medium": {
151
- "name": "Claude Opus 4.5 Think Medium (Antigravity)",
152
- "limit": { "context": 200000, "output": 64000 },
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
- "antigravity-claude-opus-4-5-thinking-high": {
156
- "name": "Claude Opus 4.5 Think High (Antigravity)",
157
- "limit": { "context": 200000, "output": 64000 },
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-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).
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-low": {
217
- "name": "Gemini 3 Pro Low (Antigravity)",
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
- "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"] }
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 (Antigravity)",
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 (Antigravity)",
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-low": {
252
- "name": "Claude Sonnet 4.5 Think Low (Antigravity)",
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-sonnet-4-5-thinking-medium": {
257
- "name": "Claude Sonnet 4.5 Think Medium (Antigravity)",
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
- "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)",
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 # quiet_mode
402
- OPENCODE_ANTIGRAVITY_DEBUG=1 # debug
403
- OPENCODE_ANTIGRAVITY_LOG_DIR=/path # log_dir
404
- OPENCODE_ANTIGRAVITY_KEEP_THINKING=1 # keep_thinking
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/anthropics/opencode-antigravity-auth/main/assets/antigravity.schema.json",
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.7+)</b></summary>
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-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` |
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-low": { ... }
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/anthropics/opencode-antigravity-auth/main/assets/antigravity.schema.json",
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":"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"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/plugin/accounts.ts"],"names":[],"mappings":"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"}