forked from NoeFabris/opencode-antigravity-auth
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodel-resolver.test.ts
More file actions
328 lines (284 loc) · 14.1 KB
/
Copy pathmodel-resolver.test.ts
File metadata and controls
328 lines (284 loc) · 14.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
import { describe, it, expect } from "vitest";
import { resolveModelWithTier, resolveModelWithVariant, resolveModelForHeaderStyle } from "./model-resolver";
describe("resolveModelWithTier", () => {
describe("Gemini 3 flash models (Issue #109)", () => {
it("antigravity-gemini-3-flash gets default thinkingLevel 'low'", () => {
const result = resolveModelWithTier("antigravity-gemini-3-flash");
expect(result.actualModel).toBe("gemini-3-flash");
expect(result.thinkingLevel).toBe("low");
expect(result.quotaPreference).toBe("antigravity");
});
it("gemini-3-flash gets default thinkingLevel 'low'", () => {
const result = resolveModelWithTier("gemini-3-flash");
expect(result.actualModel).toBe("gemini-3-flash");
expect(result.thinkingLevel).toBe("low");
expect(result.quotaPreference).toBe("antigravity");
});
it("gemini-3-flash-preview gets default thinkingLevel 'low' with antigravity quota", () => {
const result = resolveModelWithTier("gemini-3-flash-preview");
expect(result.actualModel).toBe("gemini-3-flash-preview");
expect(result.thinkingLevel).toBe("low");
// All Gemini models now default to antigravity
expect(result.quotaPreference).toBe("antigravity");
});
});
describe("Gemini 3 preview models (Issue #115)", () => {
it("gemini-3-pro-preview gets default thinkingLevel 'low' with antigravity quota", () => {
const result = resolveModelWithTier("gemini-3-pro-preview");
expect(result.actualModel).toBe("gemini-3-pro-preview");
expect(result.thinkingLevel).toBe("low");
// All Gemini models now default to antigravity
expect(result.quotaPreference).toBe("antigravity");
});
it("gemini-3.1-pro-preview gets default thinkingLevel 'low' with antigravity quota", () => {
const result = resolveModelWithTier("gemini-3.1-pro-preview");
expect(result.actualModel).toBe("gemini-3.1-pro-preview");
expect(result.thinkingLevel).toBe("low");
expect(result.quotaPreference).toBe("antigravity");
});
});
describe("All Gemini models default to antigravity quota", () => {
it("gemini-2.5-flash defaults to antigravity", () => {
const result = resolveModelWithTier("gemini-2.5-flash");
expect(result.quotaPreference).toBe("antigravity");
});
it("gemini-2.5-pro defaults to antigravity", () => {
const result = resolveModelWithTier("gemini-2.5-pro");
expect(result.quotaPreference).toBe("antigravity");
});
it("gemini-2.0-flash defaults to antigravity", () => {
const result = resolveModelWithTier("gemini-2.0-flash");
expect(result.quotaPreference).toBe("antigravity");
});
});
describe("cli_first quota preference", () => {
it("prefers gemini-cli when cli_first is true and no prefix is set", () => {
const result = resolveModelWithTier("gemini-3-flash", { cli_first: true });
expect(result.quotaPreference).toBe("gemini-cli");
expect(result.explicitQuota).toBe(false);
});
it("keeps antigravity when antigravity prefix is explicit", () => {
const result = resolveModelWithTier("antigravity-gemini-3-flash", { cli_first: true });
expect(result.quotaPreference).toBe("antigravity");
expect(result.explicitQuota).toBe(true);
});
it("keeps antigravity for Claude models when cli_first is true", () => {
const result = resolveModelWithTier("claude-opus-4-6-thinking", { cli_first: true });
expect(result.quotaPreference).toBe("antigravity");
});
it("keeps antigravity for image models when cli_first is true", () => {
const result = resolveModelWithTier("gemini-3-pro-image", { cli_first: true });
expect(result.quotaPreference).toBe("antigravity");
expect(result.explicitQuota).toBe(true);
});
it("defaults to antigravity when cli_first is false", () => {
const result = resolveModelWithTier("gemini-3-flash", { cli_first: false });
expect(result.quotaPreference).toBe("antigravity");
});
});
describe("Antigravity Gemini 3 with tier suffix", () => {
it("antigravity-gemini-3-pro-low gets thinkingLevel from tier", () => {
const result = resolveModelWithTier("antigravity-gemini-3-pro-low");
expect(result.actualModel).toBe("gemini-3-pro-low");
expect(result.thinkingLevel).toBe("low");
expect(result.quotaPreference).toBe("antigravity");
});
it("antigravity-gemini-3-pro-high gets thinkingLevel from tier", () => {
const result = resolveModelWithTier("antigravity-gemini-3-pro-high");
expect(result.actualModel).toBe("gemini-3-pro-high");
expect(result.thinkingLevel).toBe("high");
expect(result.quotaPreference).toBe("antigravity");
});
it("antigravity-gemini-3-flash-medium gets thinkingLevel from tier", () => {
const result = resolveModelWithTier("antigravity-gemini-3-flash-medium");
expect(result.actualModel).toBe("gemini-3-flash");
expect(result.thinkingLevel).toBe("medium");
});
it("antigravity-gemini-3.1-pro gets default -low model", () => {
const result = resolveModelWithTier("antigravity-gemini-3.1-pro");
expect(result.actualModel).toBe("gemini-3.1-pro-low");
expect(result.thinkingLevel).toBe("low");
});
});
describe("Claude thinking models default budget", () => {
it("antigravity-claude-opus-4-6-thinking gets default max budget (32768)", () => {
const result = resolveModelWithTier("antigravity-claude-opus-4-6-thinking");
expect(result.actualModel).toBe("claude-opus-4-6-thinking");
expect(result.thinkingBudget).toBe(32768);
expect(result.isThinkingModel).toBe(true);
expect(result.quotaPreference).toBe("antigravity");
});
});
describe("Claude Sonnet 4.6 (non-thinking)", () => {
it("claude-sonnet-4-6 resolves as non-thinking model", () => {
const result = resolveModelWithTier("claude-sonnet-4-6");
expect(result.actualModel).toBe("claude-sonnet-4-6");
expect(result.isThinkingModel).toBe(false);
expect(result.thinkingBudget).toBeUndefined();
expect(result.quotaPreference).toBe("antigravity");
});
it("antigravity-claude-sonnet-4-6 resolves as non-thinking model with explicit quota", () => {
const result = resolveModelWithTier("antigravity-claude-sonnet-4-6");
expect(result.actualModel).toBe("claude-sonnet-4-6");
expect(result.isThinkingModel).toBe(false);
expect(result.thinkingBudget).toBeUndefined();
expect(result.quotaPreference).toBe("antigravity");
expect(result.explicitQuota).toBe(true);
});
it("gemini-claude-sonnet-4-6 alias resolves to claude-sonnet-4-6", () => {
const result = resolveModelWithTier("gemini-claude-sonnet-4-6");
expect(result.actualModel).toBe("claude-sonnet-4-6");
expect(result.isThinkingModel).toBe(false);
expect(result.quotaPreference).toBe("antigravity");
});
});
describe("Image models", () => {
it("marks antigravity-gemini-3-pro-image as explicit quota", () => {
const result = resolveModelWithTier("antigravity-gemini-3-pro-image");
expect(result.actualModel).toBe("gemini-3-pro-image");
expect(result.isImageModel).toBe(true);
expect(result.explicitQuota).toBe(true);
expect(result.quotaPreference).toBe("antigravity");
});
it("marks gemini-3-pro-image as explicit quota", () => {
const result = resolveModelWithTier("gemini-3-pro-image");
expect(result.actualModel).toBe("gemini-3-pro-image");
expect(result.isImageModel).toBe(true);
expect(result.explicitQuota).toBe(true);
expect(result.quotaPreference).toBe("antigravity");
});
});
});
describe("resolveModelWithVariant", () => {
describe("without variant config", () => {
it("falls back to tier resolution for Claude thinking models", () => {
const result = resolveModelWithVariant("claude-opus-4-6-thinking-low");
expect(result.actualModel).toBe("claude-opus-4-6-thinking");
expect(result.thinkingBudget).toBe(8192);
expect(result.configSource).toBeUndefined();
});
it("falls back to tier resolution for Gemini 3 models", () => {
const result = resolveModelWithVariant("gemini-3-pro-high");
expect(result.actualModel).toBe("gemini-3-pro");
expect(result.thinkingLevel).toBe("high");
expect(result.configSource).toBeUndefined();
});
});
describe("with variant config", () => {
it("overrides tier budget for Claude models", () => {
const result = resolveModelWithVariant("antigravity-claude-opus-4-6-thinking", {
thinkingBudget: 24000,
});
expect(result.actualModel).toBe("claude-opus-4-6-thinking");
expect(result.thinkingBudget).toBe(24000);
expect(result.configSource).toBe("variant");
});
it("maps budget to thinkingLevel for Gemini 3 - low", () => {
const result = resolveModelWithVariant("antigravity-gemini-3-pro", {
thinkingBudget: 8000,
});
expect(result.actualModel).toBe("gemini-3-pro-low");
expect(result.thinkingLevel).toBe("low");
expect(result.thinkingBudget).toBeUndefined();
expect(result.configSource).toBe("variant");
});
it("maps budget to thinkingLevel for Gemini 3 Flash - medium (no tier suffix)", () => {
const result = resolveModelWithVariant("antigravity-gemini-3-flash", {
thinkingBudget: 12000,
});
expect(result.actualModel).toBe("gemini-3-flash");
expect(result.thinkingLevel).toBe("medium");
expect(result.configSource).toBe("variant");
});
it("maps budget to thinkingLevel for Gemini 3 - high", () => {
const result = resolveModelWithVariant("antigravity-gemini-3-pro", {
thinkingBudget: 32000,
});
expect(result.thinkingLevel).toBe("high");
expect(result.configSource).toBe("variant");
});
it("uses budget directly for non-Gemini 3 models", () => {
const result = resolveModelWithVariant("gemini-2.5-pro", {
thinkingBudget: 20000,
});
expect(result.thinkingBudget).toBe(20000);
expect(result.thinkingLevel).toBeUndefined();
expect(result.configSource).toBe("variant");
});
});
describe("backward compatibility", () => {
it("tier-suffixed models work without variant config", () => {
const lowResult = resolveModelWithVariant("claude-opus-4-6-thinking-low");
expect(lowResult.thinkingBudget).toBe(8192);
const medResult = resolveModelWithVariant("claude-opus-4-6-thinking-medium");
expect(medResult.thinkingBudget).toBe(16384);
const highResult = resolveModelWithVariant("claude-opus-4-6-thinking-high");
expect(highResult.thinkingBudget).toBe(32768);
});
it("variant config overrides tier suffix", () => {
const result = resolveModelWithVariant("claude-opus-4-6-thinking-low", {
thinkingBudget: 50000,
});
expect(result.thinkingBudget).toBe(50000);
expect(result.configSource).toBe("variant");
});
});
});
describe("Issue #103: resolveModelForHeaderStyle", () => {
describe("quota fallback from gemini-cli to antigravity", () => {
it("transforms gemini-3-flash-preview to gemini-3-flash for antigravity", () => {
const result = resolveModelForHeaderStyle("gemini-3-flash-preview", "antigravity");
expect(result.actualModel).toBe("gemini-3-flash");
expect(result.quotaPreference).toBe("antigravity");
});
it("transforms gemini-3-pro-preview to gemini-3-pro-low for antigravity", () => {
const result = resolveModelForHeaderStyle("gemini-3-pro-preview", "antigravity");
expect(result.actualModel).toBe("gemini-3-pro-low");
expect(result.quotaPreference).toBe("antigravity");
});
it("transforms gemini-3.1-pro-preview to gemini-3.1-pro-low for antigravity", () => {
const result = resolveModelForHeaderStyle("gemini-3.1-pro-preview", "antigravity");
expect(result.actualModel).toBe("gemini-3.1-pro-low");
expect(result.quotaPreference).toBe("antigravity");
});
it("transforms gemini-3.1-pro-preview-customtools to gemini-3.1-pro-low for antigravity", () => {
const result = resolveModelForHeaderStyle("gemini-3.1-pro-preview-customtools", "antigravity");
expect(result.actualModel).toBe("gemini-3.1-pro-low");
expect(result.quotaPreference).toBe("antigravity");
});
});
describe("quota fallback from antigravity to gemini-cli", () => {
it("transforms gemini-3-flash to gemini-3-flash-preview for gemini-cli", () => {
const result = resolveModelForHeaderStyle("gemini-3-flash", "gemini-cli");
expect(result.actualModel).toBe("gemini-3-flash-preview");
expect(result.quotaPreference).toBe("gemini-cli");
});
it("transforms gemini-3-pro-low to gemini-3-pro-preview for gemini-cli", () => {
const result = resolveModelForHeaderStyle("gemini-3-pro-low", "gemini-cli");
expect(result.actualModel).toBe("gemini-3-pro-preview");
expect(result.quotaPreference).toBe("gemini-cli");
});
it("transforms gemini-3.1-pro-low to gemini-3.1-pro-preview for gemini-cli", () => {
const result = resolveModelForHeaderStyle("gemini-3.1-pro-low", "gemini-cli");
expect(result.actualModel).toBe("gemini-3.1-pro-preview");
expect(result.quotaPreference).toBe("gemini-cli");
});
it("keeps gemini-3.1-pro-preview-customtools unchanged for gemini-cli", () => {
const result = resolveModelForHeaderStyle("gemini-3.1-pro-preview-customtools", "gemini-cli");
expect(result.actualModel).toBe("gemini-3.1-pro-preview-customtools");
expect(result.quotaPreference).toBe("gemini-cli");
});
});
describe("no transformation needed", () => {
it("keeps gemini-2.5-flash unchanged for both header styles", () => {
const antigravity = resolveModelForHeaderStyle("gemini-2.5-flash", "antigravity");
const cli = resolveModelForHeaderStyle("gemini-2.5-flash", "gemini-cli");
expect(antigravity.actualModel).toBe("gemini-2.5-flash");
expect(cli.actualModel).toBe("gemini-2.5-flash");
});
it("keeps claude models unchanged (antigravity only)", () => {
const result = resolveModelForHeaderStyle("claude-opus-4-6-thinking", "antigravity");
expect(result.actualModel).toBe("claude-opus-4-6-thinking");
});
});
});