@google/gemini-cli-core 0.21.0 → 0.21.1

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 (88) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/agents/registry.js +19 -2
  5. package/dist/src/agents/registry.js.map +1 -1
  6. package/dist/src/agents/registry.test.js +43 -0
  7. package/dist/src/agents/registry.test.js.map +1 -1
  8. package/dist/src/availability/modelAvailabilityService.d.ts +1 -0
  9. package/dist/src/availability/modelAvailabilityService.js +3 -0
  10. package/dist/src/availability/modelAvailabilityService.js.map +1 -1
  11. package/dist/src/availability/policyCatalog.d.ts +1 -0
  12. package/dist/src/availability/policyCatalog.js +6 -8
  13. package/dist/src/availability/policyCatalog.js.map +1 -1
  14. package/dist/src/availability/policyCatalog.test.js +2 -2
  15. package/dist/src/availability/policyCatalog.test.js.map +1 -1
  16. package/dist/src/availability/policyHelpers.d.ts +5 -2
  17. package/dist/src/availability/policyHelpers.js +30 -17
  18. package/dist/src/availability/policyHelpers.js.map +1 -1
  19. package/dist/src/availability/policyHelpers.test.js +30 -2
  20. package/dist/src/availability/policyHelpers.test.js.map +1 -1
  21. package/dist/src/config/config.d.ts +5 -0
  22. package/dist/src/config/config.js +56 -6
  23. package/dist/src/config/config.js.map +1 -1
  24. package/dist/src/config/config.test.js +136 -4
  25. package/dist/src/config/config.test.js.map +1 -1
  26. package/dist/src/config/defaultModelConfigs.js +11 -0
  27. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  28. package/dist/src/config/models.d.ts +24 -10
  29. package/dist/src/config/models.js +71 -23
  30. package/dist/src/config/models.js.map +1 -1
  31. package/dist/src/config/models.test.js +57 -76
  32. package/dist/src/config/models.test.js.map +1 -1
  33. package/dist/src/core/baseLlmClient.d.ts +3 -1
  34. package/dist/src/core/baseLlmClient.js +8 -1
  35. package/dist/src/core/baseLlmClient.js.map +1 -1
  36. package/dist/src/core/client.js +4 -3
  37. package/dist/src/core/client.js.map +1 -1
  38. package/dist/src/core/client.test.js +3 -1
  39. package/dist/src/core/client.test.js.map +1 -1
  40. package/dist/src/core/geminiChat.js +13 -22
  41. package/dist/src/core/geminiChat.js.map +1 -1
  42. package/dist/src/core/geminiChat.test.js +40 -186
  43. package/dist/src/core/geminiChat.test.js.map +1 -1
  44. package/dist/src/core/geminiChat_network_retry.test.js +2 -0
  45. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  46. package/dist/src/core/prompts.js +6 -7
  47. package/dist/src/core/prompts.js.map +1 -1
  48. package/dist/src/core/prompts.test.js +10 -5
  49. package/dist/src/core/prompts.test.js.map +1 -1
  50. package/dist/src/fallback/handler.js +54 -121
  51. package/dist/src/fallback/handler.js.map +1 -1
  52. package/dist/src/fallback/handler.test.js +82 -266
  53. package/dist/src/fallback/handler.test.js.map +1 -1
  54. package/dist/src/generated/git-commit.d.ts +2 -2
  55. package/dist/src/generated/git-commit.js +2 -2
  56. package/dist/src/routing/modelRouterService.js +0 -15
  57. package/dist/src/routing/modelRouterService.js.map +1 -1
  58. package/dist/src/routing/modelRouterService.test.js +0 -62
  59. package/dist/src/routing/modelRouterService.test.js.map +1 -1
  60. package/dist/src/routing/strategies/classifierStrategy.js +10 -21
  61. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  62. package/dist/src/routing/strategies/classifierStrategy.test.js +2 -1
  63. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  64. package/dist/src/routing/strategies/fallbackStrategy.js +23 -12
  65. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  66. package/dist/src/routing/strategies/fallbackStrategy.test.js +69 -39
  67. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
  68. package/dist/src/routing/strategies/overrideStrategy.js +4 -3
  69. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  70. package/dist/src/services/chatCompressionService.js +3 -1
  71. package/dist/src/services/chatCompressionService.js.map +1 -1
  72. package/dist/src/services/test-data/resolved-aliases.golden.json +16 -0
  73. package/dist/src/utils/flashFallback.test.js +1 -1
  74. package/dist/src/utils/flashFallback.test.js.map +1 -1
  75. package/dist/src/utils/googleErrors.js +31 -18
  76. package/dist/src/utils/googleErrors.js.map +1 -1
  77. package/dist/src/utils/googleErrors.test.js +10 -2
  78. package/dist/src/utils/googleErrors.test.js.map +1 -1
  79. package/dist/src/utils/googleQuotaErrors.js +6 -3
  80. package/dist/src/utils/googleQuotaErrors.js.map +1 -1
  81. package/dist/src/utils/googleQuotaErrors.test.js +41 -0
  82. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
  83. package/dist/src/utils/retry.js +2 -16
  84. package/dist/src/utils/retry.js.map +1 -1
  85. package/dist/src/utils/retry.test.js +7 -22
  86. package/dist/src/utils/retry.test.js.map +1 -1
  87. package/dist/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +1 -1
@@ -7,9 +7,7 @@ import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
7
7
  import { handleFallback } from './handler.js';
8
8
  import { createAvailabilityServiceMock } from '../availability/testUtils.js';
9
9
  import { AuthType } from '../core/contentGenerator.js';
10
- import { DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_MODEL, PREVIEW_GEMINI_MODEL, } from '../config/models.js';
11
- import { logFlashFallback } from '../telemetry/index.js';
12
- import { ModelNotFoundError } from '../utils/httpErrors.js';
10
+ import { DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_MODEL_AUTO, PREVIEW_GEMINI_FLASH_MODEL, PREVIEW_GEMINI_MODEL, PREVIEW_GEMINI_MODEL_AUTO, } from '../config/models.js';
13
11
  import { openBrowserSecurely } from '../utils/secure-browser-launcher.js';
14
12
  import { coreEvents } from '../utils/events.js';
15
13
  import { debugLogger } from '../utils/debugLogger.js';
@@ -40,7 +38,7 @@ const AUTH_API_KEY = AuthType.USE_GEMINI;
40
38
  const createMockConfig = (overrides = {}) => ({
41
39
  isInFallbackMode: vi.fn(() => false),
42
40
  setFallbackMode: vi.fn(),
43
- isModelAvailabilityServiceEnabled: vi.fn(() => false),
41
+ isModelAvailabilityServiceEnabled: vi.fn(() => true),
44
42
  isPreviewModelFallbackMode: vi.fn(() => false),
45
43
  setPreviewModelFallbackMode: vi.fn(),
46
44
  isPreviewModelBypassMode: vi.fn(() => false),
@@ -52,6 +50,7 @@ const createMockConfig = (overrides = {}) => ({
52
50
  selectedModel: FALLBACK_MODEL,
53
51
  skipped: [],
54
52
  })),
53
+ getActiveModel: vi.fn(() => MOCK_PRO_MODEL),
55
54
  getModel: vi.fn(() => MOCK_PRO_MODEL),
56
55
  getPreviewFeatures: vi.fn(() => false),
57
56
  getUserTier: vi.fn(() => undefined),
@@ -82,232 +81,6 @@ describe('handleFallback', () => {
82
81
  consoleErrorSpy.mockRestore();
83
82
  fallbackEventSpy.mockRestore();
84
83
  });
85
- it('should return null immediately if authType is not OAuth', async () => {
86
- const result = await handleFallback(mockConfig, MOCK_PRO_MODEL, AUTH_API_KEY);
87
- expect(result).toBeNull();
88
- expect(mockHandler).not.toHaveBeenCalled();
89
- expect(mockConfig.setFallbackMode).not.toHaveBeenCalled();
90
- });
91
- it('should still consult the handler if the failed model is the fallback model', async () => {
92
- mockHandler.mockResolvedValue('stop');
93
- const result = await handleFallback(mockConfig, FALLBACK_MODEL, // Failed model is Flash
94
- AUTH_OAUTH);
95
- expect(result).toBe(false);
96
- expect(mockHandler).toHaveBeenCalled();
97
- });
98
- it('should return null if no fallbackHandler is injected in config', async () => {
99
- const configWithoutHandler = createMockConfig({
100
- fallbackModelHandler: undefined,
101
- });
102
- const result = await handleFallback(configWithoutHandler, MOCK_PRO_MODEL, AUTH_OAUTH);
103
- expect(result).toBeNull();
104
- });
105
- describe('when handler returns "retry_always"', () => {
106
- it('should activate fallback mode, log telemetry, and return true', async () => {
107
- mockHandler.mockResolvedValue('retry_always');
108
- const result = await handleFallback(mockConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
109
- expect(result).toBe(true);
110
- expect(mockConfig.setFallbackMode).toHaveBeenCalledWith(true);
111
- expect(logFlashFallback).toHaveBeenCalled();
112
- });
113
- });
114
- describe('when handler returns "stop"', () => {
115
- it('should activate fallback mode, log telemetry, and return false', async () => {
116
- mockHandler.mockResolvedValue('stop');
117
- const result = await handleFallback(mockConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
118
- expect(result).toBe(false);
119
- expect(mockConfig.setFallbackMode).toHaveBeenCalledWith(true);
120
- expect(logFlashFallback).toHaveBeenCalled();
121
- });
122
- });
123
- it('should return false without toggling fallback when handler returns "retry_later"', async () => {
124
- mockHandler.mockResolvedValue('retry_later');
125
- const result = await handleFallback(mockConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
126
- expect(result).toBe(false);
127
- expect(mockConfig.setFallbackMode).not.toHaveBeenCalled();
128
- expect(logFlashFallback).not.toHaveBeenCalled();
129
- expect(fallbackEventSpy).not.toHaveBeenCalled();
130
- });
131
- it('should launch upgrade flow and avoid fallback mode when handler returns "upgrade"', async () => {
132
- mockHandler.mockResolvedValue('upgrade');
133
- vi.mocked(openBrowserSecurely).mockResolvedValue(undefined);
134
- const result = await handleFallback(mockConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
135
- expect(result).toBe(false);
136
- expect(openBrowserSecurely).toHaveBeenCalledWith('https://goo.gle/set-up-gemini-code-assist');
137
- expect(mockConfig.setFallbackMode).not.toHaveBeenCalled();
138
- expect(logFlashFallback).not.toHaveBeenCalled();
139
- expect(fallbackEventSpy).not.toHaveBeenCalled();
140
- });
141
- it('should log a warning and continue when upgrade flow fails to open a browser', async () => {
142
- mockHandler.mockResolvedValue('upgrade');
143
- const debugWarnSpy = vi.spyOn(debugLogger, 'warn');
144
- const consoleWarnSpy = vi
145
- .spyOn(console, 'warn')
146
- .mockImplementation(() => { });
147
- vi.mocked(openBrowserSecurely).mockRejectedValue(new Error('blocked'));
148
- const result = await handleFallback(mockConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
149
- expect(result).toBe(false);
150
- expect(debugWarnSpy).toHaveBeenCalledWith('Failed to open browser automatically:', 'blocked');
151
- expect(mockConfig.setFallbackMode).not.toHaveBeenCalled();
152
- expect(fallbackEventSpy).not.toHaveBeenCalled();
153
- debugWarnSpy.mockRestore();
154
- consoleWarnSpy.mockRestore();
155
- });
156
- describe('when handler returns an unexpected value', () => {
157
- it('should log an error and return null', async () => {
158
- mockHandler.mockResolvedValue(null);
159
- const result = await handleFallback(mockConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
160
- expect(result).toBeNull();
161
- expect(consoleErrorSpy).toHaveBeenCalledWith('Fallback UI handler failed:', new Error('Unexpected fallback intent received from fallbackModelHandler: "null"'));
162
- expect(mockConfig.setFallbackMode).not.toHaveBeenCalled();
163
- });
164
- });
165
- it('should pass the correct context (failedModel, fallbackModel, error) to the handler', async () => {
166
- const mockError = new Error('Quota Exceeded');
167
- mockHandler.mockResolvedValue('retry_always');
168
- await handleFallback(mockConfig, MOCK_PRO_MODEL, AUTH_OAUTH, mockError);
169
- expect(mockHandler).toHaveBeenCalledWith(MOCK_PRO_MODEL, FALLBACK_MODEL, mockError);
170
- });
171
- it('should not call setFallbackMode or log telemetry if already in fallback mode', async () => {
172
- // Setup config where fallback mode is already active
173
- const activeFallbackConfig = createMockConfig({
174
- fallbackModelHandler: mockHandler,
175
- isInFallbackMode: vi.fn(() => true), // Already active
176
- setFallbackMode: vi.fn(),
177
- });
178
- mockHandler.mockResolvedValue('retry_always');
179
- const result = await handleFallback(activeFallbackConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
180
- // Should still return true to allow the retry (which will use the active fallback mode)
181
- expect(result).toBe(true);
182
- // Should still consult the handler
183
- expect(mockHandler).toHaveBeenCalled();
184
- // But should not mutate state or log telemetry again
185
- expect(activeFallbackConfig.setFallbackMode).not.toHaveBeenCalled();
186
- expect(logFlashFallback).not.toHaveBeenCalled();
187
- });
188
- it('should catch errors from the handler, log an error, and return null', async () => {
189
- const handlerError = new Error('UI interaction failed');
190
- mockHandler.mockRejectedValue(handlerError);
191
- const result = await handleFallback(mockConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
192
- expect(result).toBeNull();
193
- expect(consoleErrorSpy).toHaveBeenCalledWith('Fallback UI handler failed:', handlerError);
194
- expect(mockConfig.setFallbackMode).not.toHaveBeenCalled();
195
- });
196
- describe('Preview Model Fallback Logic', () => {
197
- const previewModel = PREVIEW_GEMINI_MODEL;
198
- it('should only set Preview Model bypass mode on retryable quota failure', async () => {
199
- const mockGoogleApiError = {
200
- code: 429,
201
- message: 'mock error',
202
- details: [],
203
- };
204
- const retryableQuotaError = new RetryableQuotaError('Capacity error', mockGoogleApiError, 5);
205
- await handleFallback(mockConfig, previewModel, AUTH_OAUTH, retryableQuotaError);
206
- expect(mockConfig.setPreviewModelBypassMode).toHaveBeenCalledWith(true);
207
- });
208
- it('should not set Preview Model bypass mode on non-retryable quota failure', async () => {
209
- const mockGoogleApiError = {
210
- code: 429,
211
- message: 'mock error',
212
- details: [],
213
- };
214
- const terminalQuotaError = new TerminalQuotaError('quota error', mockGoogleApiError, 5);
215
- await handleFallback(mockConfig, previewModel, AUTH_OAUTH, terminalQuotaError);
216
- expect(mockConfig.setPreviewModelBypassMode).not.toHaveBeenCalled();
217
- });
218
- it('should silently retry if Preview Model fallback mode is already active and error is retryable error', async () => {
219
- vi.spyOn(mockConfig, 'isPreviewModelFallbackMode').mockReturnValue(true);
220
- const mockGoogleApiError = {
221
- code: 429,
222
- message: 'mock error',
223
- details: [],
224
- };
225
- const retryableQuotaError = new RetryableQuotaError('Capacity error', mockGoogleApiError, 5);
226
- const result = await handleFallback(mockConfig, previewModel, AUTH_OAUTH, retryableQuotaError);
227
- expect(result).toBe(true);
228
- expect(mockHandler).not.toHaveBeenCalled();
229
- });
230
- it('should activate Preview Model fallback mode when handler returns "retry_always" and is RetryableQuotaError', async () => {
231
- mockHandler.mockResolvedValue('retry_always');
232
- const mockGoogleApiError = {
233
- code: 429,
234
- message: 'mock error',
235
- details: [],
236
- };
237
- const retryableQuotaError = new RetryableQuotaError('Capacity error', mockGoogleApiError, 5);
238
- const result = await handleFallback(mockConfig, previewModel, AUTH_OAUTH, retryableQuotaError);
239
- expect(result).toBe(true);
240
- expect(mockConfig.setPreviewModelBypassMode).toHaveBeenCalledWith(true);
241
- expect(mockConfig.setPreviewModelFallbackMode).toHaveBeenCalledWith(true);
242
- });
243
- it('should activate regular fallback when handler returns "retry_always" and is TerminalQuotaError', async () => {
244
- mockHandler.mockResolvedValue('retry_always');
245
- const mockGoogleApiError = {
246
- code: 503,
247
- message: 'mock error',
248
- details: [],
249
- };
250
- const terminalError = new TerminalQuotaError('Quota error', mockGoogleApiError, 5);
251
- const result = await handleFallback(mockConfig, previewModel, AUTH_OAUTH, terminalError);
252
- expect(result).toBe(true);
253
- expect(mockConfig.setPreviewModelFallbackMode).not.toBeCalled();
254
- expect(mockConfig.setFallbackMode).toHaveBeenCalledWith(true);
255
- });
256
- it('should NOT set fallback mode if user chooses "retry_once"', async () => {
257
- const mockGoogleApiError = {
258
- code: 429,
259
- message: 'mock error',
260
- details: [],
261
- };
262
- const terminalQuotaError = new TerminalQuotaError('quota error', mockGoogleApiError, 5);
263
- mockHandler.mockResolvedValue('retry_once');
264
- const result = await handleFallback(mockConfig, PREVIEW_GEMINI_MODEL, AuthType.LOGIN_WITH_GOOGLE, terminalQuotaError);
265
- expect(result).toBe(true);
266
- expect(mockConfig.setPreviewModelBypassMode).not.toHaveBeenCalled();
267
- expect(mockConfig.setPreviewModelFallbackMode).not.toHaveBeenCalled();
268
- expect(mockConfig.setFallbackMode).not.toHaveBeenCalled();
269
- });
270
- it('should pass DEFAULT_GEMINI_MODEL as fallback when Preview Model fails with Retryable Error', async () => {
271
- const mockFallbackHandler = vi.fn().mockResolvedValue('stop');
272
- vi.mocked(mockConfig.fallbackModelHandler).mockImplementation(mockFallbackHandler);
273
- const mockGoogleApiError = {
274
- code: 429,
275
- message: 'mock error',
276
- details: [],
277
- };
278
- const retryableQuotaError = new RetryableQuotaError('Capacity error', mockGoogleApiError, 5);
279
- await handleFallback(mockConfig, PREVIEW_GEMINI_MODEL, AuthType.LOGIN_WITH_GOOGLE, retryableQuotaError);
280
- expect(mockConfig.fallbackModelHandler).toHaveBeenCalledWith(PREVIEW_GEMINI_MODEL, DEFAULT_GEMINI_MODEL, retryableQuotaError);
281
- });
282
- it('should pass DEFAULT_GEMINI_MODEL as fallback when Preview Model fails with other error', async () => {
283
- await handleFallback(mockConfig, PREVIEW_GEMINI_MODEL, AuthType.LOGIN_WITH_GOOGLE);
284
- expect(mockConfig.fallbackModelHandler).toHaveBeenCalledWith(PREVIEW_GEMINI_MODEL, DEFAULT_GEMINI_MODEL, undefined);
285
- });
286
- it('should pass DEFAULT_GEMINI_FLASH_MODEL as fallback when Preview Model fails with other error', async () => {
287
- const mockGoogleApiError = {
288
- code: 429,
289
- message: 'mock error',
290
- details: [],
291
- };
292
- const terminalQuotaError = new TerminalQuotaError('quota error', mockGoogleApiError, 5);
293
- await handleFallback(mockConfig, PREVIEW_GEMINI_MODEL, AuthType.LOGIN_WITH_GOOGLE, terminalQuotaError);
294
- expect(mockConfig.fallbackModelHandler).toHaveBeenCalledWith(PREVIEW_GEMINI_MODEL, DEFAULT_GEMINI_FLASH_MODEL, terminalQuotaError);
295
- });
296
- });
297
- it('should return null if ModelNotFoundError occurs for a non-preview model', async () => {
298
- const modelNotFoundError = new ModelNotFoundError('Not found');
299
- const result = await handleFallback(mockConfig, DEFAULT_GEMINI_MODEL, // Not preview model
300
- AUTH_OAUTH, modelNotFoundError);
301
- expect(result).toBeNull();
302
- expect(mockHandler).not.toHaveBeenCalled();
303
- });
304
- it('should consult handler if ModelNotFoundError occurs for preview model', async () => {
305
- const modelNotFoundError = new ModelNotFoundError('Not found');
306
- mockHandler.mockResolvedValue('retry_always');
307
- const result = await handleFallback(mockConfig, PREVIEW_GEMINI_MODEL, AUTH_OAUTH, modelNotFoundError);
308
- expect(result).toBe(true);
309
- expect(mockHandler).toHaveBeenCalled();
310
- });
311
84
  describe('policy-driven flow', () => {
312
85
  let policyConfig;
313
86
  let availability;
@@ -320,20 +93,27 @@ describe('handleFallback', () => {
320
93
  });
321
94
  policyHandler = vi.fn().mockResolvedValue('retry_once');
322
95
  policyConfig = createMockConfig();
323
- vi.spyOn(policyConfig, 'isModelAvailabilityServiceEnabled').mockReturnValue(true);
324
- vi.spyOn(policyConfig, 'getModelAvailabilityService').mockReturnValue(availability);
325
- vi.spyOn(policyConfig, 'getFallbackModelHandler').mockReturnValue(policyHandler);
96
+ // Ensure we test the availability path
97
+ vi.mocked(policyConfig.isModelAvailabilityServiceEnabled).mockReturnValue(true);
98
+ vi.mocked(policyConfig.getModelAvailabilityService).mockReturnValue(availability);
99
+ vi.mocked(policyConfig.getFallbackModelHandler).mockReturnValue(policyHandler);
100
+ });
101
+ it('should return null immediately if authType is not OAuth', async () => {
102
+ const result = await handleFallback(policyConfig, MOCK_PRO_MODEL, AUTH_API_KEY);
103
+ expect(result).toBeNull();
104
+ expect(policyHandler).not.toHaveBeenCalled();
326
105
  });
327
106
  it('uses availability selection with correct candidates when enabled', async () => {
328
- vi.spyOn(policyConfig, 'getPreviewFeatures').mockReturnValue(true);
329
- vi.spyOn(policyConfig, 'getModel').mockReturnValue(DEFAULT_GEMINI_MODEL);
107
+ // Direct mock manipulation since it's already a vi.fn()
108
+ vi.mocked(policyConfig.getPreviewFeatures).mockReturnValue(true);
109
+ vi.mocked(policyConfig.getModel).mockReturnValue(DEFAULT_GEMINI_MODEL_AUTO);
330
110
  await handleFallback(policyConfig, DEFAULT_GEMINI_MODEL, AUTH_OAUTH);
331
111
  expect(availability.selectFirstAvailable).toHaveBeenCalledWith([
332
112
  DEFAULT_GEMINI_FLASH_MODEL,
333
- PREVIEW_GEMINI_MODEL,
334
113
  ]);
335
114
  });
336
115
  it('falls back to last resort when availability returns null', async () => {
116
+ vi.mocked(policyConfig.getModel).mockReturnValue(DEFAULT_GEMINI_MODEL_AUTO);
337
117
  availability.selectFirstAvailable = vi
338
118
  .fn()
339
119
  .mockReturnValue({ selectedModel: null, skipped: [] });
@@ -376,70 +156,106 @@ describe('handleFallback', () => {
376
156
  chainSpy.mockRestore();
377
157
  }
378
158
  });
379
- it('wraps around to upgrade candidates if the current model was selected mid-chain (e.g. by router)', async () => {
159
+ it('does not wrap around to upgrade candidates if the current model was selected at the end (e.g. by router)', async () => {
380
160
  // Last-resort failure (Flash) in [Preview, Pro, Flash] checks Preview then Pro (all upstream).
381
- vi.spyOn(policyConfig, 'getPreviewFeatures').mockReturnValue(true);
161
+ vi.mocked(policyConfig.getPreviewFeatures).mockReturnValue(true);
162
+ vi.mocked(policyConfig.getModel).mockReturnValue(DEFAULT_GEMINI_MODEL_AUTO);
382
163
  availability.selectFirstAvailable = vi.fn().mockReturnValue({
383
164
  selectedModel: MOCK_PRO_MODEL,
384
165
  skipped: [],
385
166
  });
386
167
  policyHandler.mockResolvedValue('retry_once');
387
168
  await handleFallback(policyConfig, DEFAULT_GEMINI_FLASH_MODEL, AUTH_OAUTH);
388
- expect(availability.selectFirstAvailable).toHaveBeenCalledWith([
389
- PREVIEW_GEMINI_MODEL,
390
- MOCK_PRO_MODEL,
391
- ]);
392
- expect(policyHandler).toHaveBeenCalledWith(DEFAULT_GEMINI_FLASH_MODEL, MOCK_PRO_MODEL, undefined);
393
- });
394
- it('logs and returns null when handler resolves to null', async () => {
395
- policyHandler.mockResolvedValue(null);
396
- const debugLoggerErrorSpy = vi.spyOn(debugLogger, 'error');
397
- const result = await handleFallback(policyConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
398
- expect(result).toBeNull();
399
- expect(debugLoggerErrorSpy).toHaveBeenCalledWith('Fallback handler failed:', new Error('Unexpected fallback intent received from fallbackModelHandler: "null"'));
400
- debugLoggerErrorSpy.mockRestore();
169
+ expect(availability.selectFirstAvailable).not.toHaveBeenCalled();
170
+ expect(policyHandler).toHaveBeenCalledWith(DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_FLASH_MODEL, undefined);
401
171
  });
402
172
  it('successfully follows expected availability response for Preview Chain', async () => {
403
- availability.selectFirstAvailable = vi
404
- .fn()
405
- .mockReturnValue({ selectedModel: DEFAULT_GEMINI_MODEL, skipped: [] });
173
+ availability.selectFirstAvailable = vi.fn().mockReturnValue({
174
+ selectedModel: PREVIEW_GEMINI_FLASH_MODEL,
175
+ skipped: [],
176
+ });
406
177
  policyHandler.mockResolvedValue('retry_once');
407
- vi.spyOn(policyConfig, 'getPreviewFeatures').mockReturnValue(true);
408
- vi.spyOn(policyConfig, 'getModel').mockReturnValue(PREVIEW_GEMINI_MODEL);
178
+ vi.mocked(policyConfig.getPreviewFeatures).mockReturnValue(true);
179
+ vi.mocked(policyConfig.getActiveModel).mockReturnValue(PREVIEW_GEMINI_MODEL);
180
+ vi.mocked(policyConfig.getModel).mockReturnValue(PREVIEW_GEMINI_MODEL_AUTO);
409
181
  const result = await handleFallback(policyConfig, PREVIEW_GEMINI_MODEL, AUTH_OAUTH);
410
182
  expect(result).toBe(true);
411
183
  expect(availability.selectFirstAvailable).toHaveBeenCalledWith([
412
- DEFAULT_GEMINI_MODEL,
413
- DEFAULT_GEMINI_FLASH_MODEL,
184
+ PREVIEW_GEMINI_FLASH_MODEL,
414
185
  ]);
415
- expect(policyHandler).toHaveBeenCalledWith(PREVIEW_GEMINI_MODEL, DEFAULT_GEMINI_MODEL, undefined);
416
186
  });
417
- it('short-circuits when the failed model is the last-resort policy AND candidates are unavailable', async () => {
187
+ it('should launch upgrade flow and avoid fallback mode when handler returns "upgrade"', async () => {
188
+ policyHandler.mockResolvedValue('upgrade');
189
+ vi.mocked(openBrowserSecurely).mockResolvedValue(undefined);
190
+ const result = await handleFallback(policyConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
191
+ expect(result).toBe(false);
192
+ expect(openBrowserSecurely).toHaveBeenCalledWith('https://goo.gle/set-up-gemini-code-assist');
193
+ expect(policyConfig.setActiveModel).not.toHaveBeenCalled();
194
+ });
195
+ it('should catch errors from the handler, log an error, and return null', async () => {
196
+ const handlerError = new Error('UI interaction failed');
197
+ policyHandler.mockRejectedValue(handlerError);
198
+ const result = await handleFallback(policyConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
199
+ expect(result).toBeNull();
200
+ expect(debugLogger.error).toHaveBeenCalledWith('Fallback handler failed:', handlerError);
201
+ });
202
+ it('should pass TerminalQuotaError (429) correctly to the handler', async () => {
203
+ const mockGoogleApiError = {
204
+ code: 429,
205
+ message: 'mock error',
206
+ details: [],
207
+ };
208
+ const terminalError = new TerminalQuotaError('Quota error', mockGoogleApiError, 5);
209
+ policyHandler.mockResolvedValue('retry_always');
210
+ vi.mocked(policyConfig.getModel).mockReturnValue(DEFAULT_GEMINI_MODEL_AUTO);
211
+ await handleFallback(policyConfig, MOCK_PRO_MODEL, AUTH_OAUTH, terminalError);
212
+ expect(policyHandler).toHaveBeenCalledWith(MOCK_PRO_MODEL, DEFAULT_GEMINI_FLASH_MODEL, terminalError);
213
+ });
214
+ it('should pass RetryableQuotaError correctly to the handler', async () => {
215
+ const mockGoogleApiError = {
216
+ code: 503,
217
+ message: 'mock error',
218
+ details: [],
219
+ };
220
+ const retryableError = new RetryableQuotaError('Service unavailable', mockGoogleApiError, 1000);
221
+ policyHandler.mockResolvedValue('retry_once');
222
+ vi.mocked(policyConfig.getModel).mockReturnValue(DEFAULT_GEMINI_MODEL_AUTO);
223
+ await handleFallback(policyConfig, MOCK_PRO_MODEL, AUTH_OAUTH, retryableError);
224
+ expect(policyHandler).toHaveBeenCalledWith(MOCK_PRO_MODEL, DEFAULT_GEMINI_FLASH_MODEL, retryableError);
225
+ });
226
+ it('Call the handler with fallback model same as the failed model when the failed model is the last-resort policy', async () => {
418
227
  // Ensure short-circuit when wrapping to an unavailable upstream model.
419
228
  availability.selectFirstAvailable = vi
420
229
  .fn()
421
230
  .mockReturnValue({ selectedModel: null, skipped: [] });
231
+ vi.mocked(policyConfig.getModel).mockReturnValue(DEFAULT_GEMINI_MODEL_AUTO);
422
232
  const result = await handleFallback(policyConfig, DEFAULT_GEMINI_FLASH_MODEL, AUTH_OAUTH);
423
- expect(result).toBeNull();
424
- // Service called to check upstream; no UI handler since nothing selected.
425
- expect(policyConfig.getModelAvailabilityService).toHaveBeenCalled();
426
- expect(policyConfig.getFallbackModelHandler).not.toHaveBeenCalled();
233
+ policyHandler.mockResolvedValue('retry_once');
234
+ expect(result).not.toBeNull();
235
+ expect(policyHandler).toHaveBeenCalledWith(DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_FLASH_MODEL, undefined);
427
236
  });
428
237
  it('calls setActiveModel and logs telemetry when handler returns "retry_always"', async () => {
429
238
  policyHandler.mockResolvedValue('retry_always');
239
+ vi.mocked(policyConfig.getModel).mockReturnValue(DEFAULT_GEMINI_MODEL_AUTO);
430
240
  const result = await handleFallback(policyConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
431
241
  expect(result).toBe(true);
432
242
  expect(policyConfig.setActiveModel).toHaveBeenCalledWith(FALLBACK_MODEL);
433
243
  expect(policyConfig.setFallbackMode).not.toHaveBeenCalled();
434
244
  // TODO: add logging expect statement
435
245
  });
436
- it('calls setActiveModel when handler returns "stop"', async () => {
246
+ it('does NOT call setActiveModel when handler returns "stop"', async () => {
437
247
  policyHandler.mockResolvedValue('stop');
438
248
  const result = await handleFallback(policyConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
439
249
  expect(result).toBe(false);
440
- expect(policyConfig.setActiveModel).toHaveBeenCalledWith(FALLBACK_MODEL);
250
+ expect(policyConfig.setActiveModel).not.toHaveBeenCalled();
441
251
  // TODO: add logging expect statement
442
252
  });
253
+ it('does NOT call setActiveModel when handler returns "retry_once"', async () => {
254
+ policyHandler.mockResolvedValue('retry_once');
255
+ const result = await handleFallback(policyConfig, MOCK_PRO_MODEL, AUTH_OAUTH);
256
+ expect(result).toBe(true);
257
+ expect(policyConfig.setActiveModel).not.toHaveBeenCalled();
258
+ });
443
259
  });
444
260
  });
445
261
  //# sourceMappingURL=handler.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler.test.js","sourceRoot":"","sources":["../../../src/fallback/handler.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handler.test.js","sourceRoot":"","sources":["../../../src/fallback/handler.test.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,5 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- export declare const GIT_COMMIT_INFO = "1f1bbc462";
7
- export declare const CLI_VERSION = "0.21.0";
6
+ export declare const GIT_COMMIT_INFO = "4bdf85f30";
7
+ export declare const CLI_VERSION = "0.21.1";
@@ -5,6 +5,6 @@
5
5
  */
6
6
  // This file is auto-generated by the build script (scripts/generate-git-commit-info.js)
7
7
  // Do not edit this file manually.
8
- export const GIT_COMMIT_INFO = '1f1bbc462';
9
- export const CLI_VERSION = '0.21.0';
8
+ export const GIT_COMMIT_INFO = '4bdf85f30';
9
+ export const CLI_VERSION = '0.21.1';
10
10
  //# sourceMappingURL=git-commit.js.map
@@ -3,7 +3,6 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { PREVIEW_GEMINI_MODEL, DEFAULT_GEMINI_MODEL, } from '../config/models.js';
7
6
  import { DefaultStrategy } from './strategies/defaultStrategy.js';
8
7
  import { ClassifierStrategy } from './strategies/classifierStrategy.js';
9
8
  import { CompositeStrategy } from './strategies/compositeStrategy.js';
@@ -42,20 +41,6 @@ export class ModelRouterService {
42
41
  let decision;
43
42
  try {
44
43
  decision = await this.strategy.route(context, this.config, this.config.getBaseLlmClient());
45
- // Unified Preview Model Logic:
46
- // If the decision is to use 'gemini-2.5-pro' and preview features are enabled,
47
- // we attempt to upgrade to 'gemini-3.0-pro' (Preview Model).
48
- if (decision.model === DEFAULT_GEMINI_MODEL &&
49
- this.config.getPreviewFeatures() &&
50
- !decision.metadata.source.includes('override')) {
51
- // We ALWAYS attempt to upgrade to Preview Model here.
52
- // If we are in fallback mode, the 'previewModelBypassMode' flag (handled in handler.ts/geminiChat.ts)
53
- // will ensure we downgrade to 2.5 Pro for the actual API call if needed.
54
- // This allows us to "probe" Preview Model periodically (i.e., every new request tries Preview Model first).
55
- decision.model = PREVIEW_GEMINI_MODEL;
56
- decision.metadata.source += ' (Preview Model)';
57
- decision.metadata.reasoning += ' (Upgraded to Preview Model)';
58
- }
59
44
  const event = new ModelRoutingEvent(decision.model, decision.metadata.source, decision.metadata.latencyMs, decision.metadata.reasoning, false, // failed
60
45
  undefined);
61
46
  logModelRouting(this.config, event);
@@ -1 +1 @@
1
- {"version":3,"file":"modelRouterService.js","sourceRoot":"","sources":["../../../src/routing/modelRouterService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAAS;IACf,QAAQ,CAAmB;IAEnC,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACnD,CAAC;IAEO,yBAAyB;QAC/B,qEAAqE;QACrE,2DAA2D;QAC3D,OAAO,IAAI,iBAAiB,CAC1B;YACE,IAAI,gBAAgB,EAAE;YACtB,IAAI,gBAAgB,EAAE;YACtB,IAAI,kBAAkB,EAAE;YACxB,IAAI,eAAe,EAAE;SACtB,EACD,cAAc,CACf,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CAAC,OAAuB;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,QAAyB,CAAC;QAE9B,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAClC,OAAO,EACP,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAC/B,CAAC;YAEF,+BAA+B;YAC/B,+EAA+E;YAC/E,6DAA6D;YAC7D,IACE,QAAQ,CAAC,KAAK,KAAK,oBAAoB;gBACvC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;gBAChC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC9C,CAAC;gBACD,sDAAsD;gBACtD,sGAAsG;gBACtG,yEAAyE;gBACzE,4GAA4G;gBAC5G,QAAQ,CAAC,KAAK,GAAG,oBAAoB,CAAC;gBACtC,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,kBAAkB,CAAC;gBAC/C,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,8BAA8B,CAAC;YAChE,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,iBAAiB,CACjC,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,QAAQ,CAAC,MAAM,EACxB,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAC3B,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAC3B,KAAK,EAAE,SAAS;YAChB,SAAS,CACV,CAAC;YACF,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAEpC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,IAAI,CAAC;YACpB,MAAM,aAAa,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjE,kDAAkD;YAClD,uEAAuE;YACvE,sDAAsD;YACtD,QAAQ,GAAG;gBACT,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAC7B,QAAQ,EAAE;oBACR,MAAM,EAAE,kBAAkB;oBAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACjC,SAAS,EAAE,uCAAuC;oBAClD,KAAK,EAAE,aAAa;iBACrB;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,iBAAiB,CACjC,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,QAAQ,CAAC,MAAM,EACxB,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAC3B,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAC3B,MAAM,EACN,aAAa,CACd,CAAC;YAEF,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAEpC,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"modelRouterService.js","sourceRoot":"","sources":["../../../src/routing/modelRouterService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAAS;IACf,QAAQ,CAAmB;IAEnC,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACnD,CAAC;IAEO,yBAAyB;QAC/B,qEAAqE;QACrE,2DAA2D;QAC3D,OAAO,IAAI,iBAAiB,CAC1B;YACE,IAAI,gBAAgB,EAAE;YACtB,IAAI,gBAAgB,EAAE;YACtB,IAAI,kBAAkB,EAAE;YACxB,IAAI,eAAe,EAAE;SACtB,EACD,cAAc,CACf,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CAAC,OAAuB;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,QAAyB,CAAC;QAE9B,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAClC,OAAO,EACP,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAC/B,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,iBAAiB,CACjC,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,QAAQ,CAAC,MAAM,EACxB,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAC3B,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAC3B,KAAK,EAAE,SAAS;YAChB,SAAS,CACV,CAAC;YACF,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAEpC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,IAAI,CAAC;YACpB,MAAM,aAAa,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjE,kDAAkD;YAClD,uEAAuE;YACvE,sDAAsD;YACtD,QAAQ,GAAG;gBACT,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAC7B,QAAQ,EAAE;oBACR,MAAM,EAAE,kBAAkB;oBAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACjC,SAAS,EAAE,uCAAuC;oBAClD,KAAK,EAAE,aAAa;iBACrB;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,iBAAiB,CACjC,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,QAAQ,CAAC,MAAM,EACxB,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAC3B,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAC3B,MAAM,EACN,aAAa,CACd,CAAC;YAEF,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAEpC,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;CACF"}
@@ -6,7 +6,6 @@
6
6
  import { describe, it, expect, vi, beforeEach } from 'vitest';
7
7
  import { ModelRouterService } from './modelRouterService.js';
8
8
  import { Config } from '../config/config.js';
9
- import { PREVIEW_GEMINI_MODEL, DEFAULT_GEMINI_MODEL, } from '../config/models.js';
10
9
  import { DefaultStrategy } from './strategies/defaultStrategy.js';
11
10
  import { CompositeStrategy } from './strategies/compositeStrategy.js';
12
11
  import { FallbackStrategy } from './strategies/fallbackStrategy.js';
@@ -94,67 +93,6 @@ describe('ModelRouterService', () => {
94
93
  expect(ModelRoutingEvent).toHaveBeenCalledWith('default-model', 'router-exception', expect.any(Number), 'An exception occurred during routing.', true, 'Strategy failed');
95
94
  expect(logModelRouting).toHaveBeenCalledWith(mockConfig, expect.any(ModelRoutingEvent));
96
95
  });
97
- it('should upgrade to Preview Model when preview features are enabled and model is 2.5 Pro', async () => {
98
- vi.spyOn(mockCompositeStrategy, 'route').mockResolvedValue({
99
- model: DEFAULT_GEMINI_MODEL,
100
- metadata: { source: 'test', latencyMs: 0, reasoning: 'test' },
101
- });
102
- vi.spyOn(mockConfig, 'getPreviewFeatures').mockReturnValue(true);
103
- vi.spyOn(mockConfig, 'isPreviewModelFallbackMode').mockReturnValue(false);
104
- const decision = await service.route(mockContext);
105
- expect(decision.model).toBe(PREVIEW_GEMINI_MODEL);
106
- });
107
- it('should NOT upgrade to Preview Model when preview features are disabled', async () => {
108
- vi.spyOn(mockCompositeStrategy, 'route').mockResolvedValue({
109
- model: DEFAULT_GEMINI_MODEL,
110
- metadata: { source: 'test', latencyMs: 0, reasoning: 'test' },
111
- });
112
- vi.spyOn(mockConfig, 'getPreviewFeatures').mockReturnValue(false);
113
- const decision = await service.route(mockContext);
114
- expect(decision.model).toBe(DEFAULT_GEMINI_MODEL);
115
- });
116
- it('should upgrade to Preview Model when preview features are enabled and model is explicitly set to Pro', async () => {
117
- // Simulate OverrideStrategy returning Preview Model (as resolveModel would do for "pro")
118
- vi.spyOn(mockCompositeStrategy, 'route').mockResolvedValue({
119
- model: PREVIEW_GEMINI_MODEL,
120
- metadata: {
121
- source: 'override',
122
- latencyMs: 0,
123
- reasoning: 'User selected',
124
- },
125
- });
126
- vi.spyOn(mockConfig, 'getPreviewFeatures').mockReturnValue(true);
127
- vi.spyOn(mockConfig, 'isPreviewModelFallbackMode').mockReturnValue(false);
128
- const decision = await service.route(mockContext);
129
- expect(decision.model).toBe(PREVIEW_GEMINI_MODEL);
130
- });
131
- it('should NOT upgrade to Preview Model when preview features are enabled and model is explicitly set to a specific string', async () => {
132
- // Simulate OverrideStrategy returning a specific model (e.g. "gemini-2.5-pro")
133
- // This happens when user explicitly sets model to "gemini-2.5-pro" instead of "pro"
134
- vi.spyOn(mockCompositeStrategy, 'route').mockResolvedValue({
135
- model: DEFAULT_GEMINI_MODEL,
136
- metadata: {
137
- source: 'override',
138
- latencyMs: 0,
139
- reasoning: 'User selected',
140
- },
141
- });
142
- vi.spyOn(mockConfig, 'getPreviewFeatures').mockReturnValue(true);
143
- vi.spyOn(mockConfig, 'isPreviewModelFallbackMode').mockReturnValue(false);
144
- const decision = await service.route(mockContext);
145
- // Should NOT upgrade to Preview Model because source is 'override' and model is specific
146
- expect(decision.model).toBe(DEFAULT_GEMINI_MODEL);
147
- });
148
- it('should upgrade to Preview Model even if fallback mode is active (probing behavior)', async () => {
149
- vi.spyOn(mockCompositeStrategy, 'route').mockResolvedValue({
150
- model: DEFAULT_GEMINI_MODEL,
151
- metadata: { source: 'default', latencyMs: 0, reasoning: 'Default' },
152
- });
153
- vi.spyOn(mockConfig, 'getPreviewFeatures').mockReturnValue(true);
154
- vi.spyOn(mockConfig, 'isPreviewModelFallbackMode').mockReturnValue(true);
155
- const decision = await service.route(mockContext);
156
- expect(decision.model).toBe(PREVIEW_GEMINI_MODEL);
157
- });
158
96
  });
159
97
  });
160
98
  //# sourceMappingURL=modelRouterService.test.js.map