Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions docs/get-started/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,12 @@ their corresponding top-level category object in your `settings.json` file.
"model": "gemini-2.5-flash"
}
},
"gemini-3-flash-base": {
"extends": "base",
"modelConfig": {
"model": "gemini-3-flash-preview"
}
},
"classifier": {
"extends": "base",
"modelConfig": {
Expand Down Expand Up @@ -502,7 +508,7 @@ their corresponding top-level category object in your `settings.json` file.
}
},
"web-search": {
"extends": "gemini-2.5-flash-base",
"extends": "gemini-3-flash-base",
"modelConfig": {
"generateContentConfig": {
"tools": [
Expand All @@ -514,7 +520,7 @@ their corresponding top-level category object in your `settings.json` file.
}
},
"web-fetch": {
"extends": "gemini-2.5-flash-base",
"extends": "gemini-3-flash-base",
"modelConfig": {
"generateContentConfig": {
"tools": [
Expand All @@ -526,25 +532,25 @@ their corresponding top-level category object in your `settings.json` file.
}
},
"web-fetch-fallback": {
"extends": "gemini-2.5-flash-base",
"extends": "gemini-3-flash-base",
"modelConfig": {}
},
"loop-detection": {
"extends": "gemini-2.5-flash-base",
"extends": "gemini-3-flash-base",
"modelConfig": {}
},
"loop-detection-double-check": {
"extends": "base",
"modelConfig": {
"model": "gemini-2.5-pro"
"model": "gemini-3-pro-preview"
}
},
"llm-edit-fixer": {
"extends": "gemini-2.5-flash-base",
"extends": "gemini-3-flash-base",
"modelConfig": {}
},
"next-speaker-checker": {
"extends": "gemini-2.5-flash-base",
"extends": "gemini-3-flash-base",
"modelConfig": {}
},
"chat-compression-3-pro": {
Expand Down Expand Up @@ -574,7 +580,7 @@ their corresponding top-level category object in your `settings.json` file.
},
"chat-compression-default": {
"modelConfig": {
"model": "gemini-2.5-pro"
"model": "gemini-3-pro-preview"
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions packages/core/src/availability/fallbackIntegration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ describe('Fallback Integration', () => {
);
});

it('should NOT fallback if config is NOT in AUTO mode', () => {
it('should fallback for Gemini 3 models even if config is NOT in AUTO mode', () => {
// 1. Config is explicitly set to Pro, not Auto
vi.spyOn(config, 'getModel').mockReturnValue(PREVIEW_GEMINI_MODEL);

Expand All @@ -71,7 +71,7 @@ describe('Fallback Integration', () => {
// 4. Apply model selection
const result = applyModelSelection(config, { model: requestedModel });

// 5. Expect it to stay on Pro (because single model chain)
expect(result.model).toBe(PREVIEW_GEMINI_MODEL);
// 5. Expect it to fallback to Flash (because Gemini 3 uses PREVIEW_CHAIN)
expect(result.model).toBe(PREVIEW_GEMINI_FLASH_MODEL);
});
});
13 changes: 13 additions & 0 deletions packages/core/src/availability/policyHelpers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,19 @@ describe('policyHelpers', () => {
expect(chain[0]?.model).toBe('gemini-2.5-flash');
expect(chain[1]?.model).toBe('gemini-2.5-pro');
});

it('proactively returns Gemini 2.5 chain if Gemini 3 requested but user lacks access', () => {
const config = createMockConfig({
getModel: () => 'auto-gemini-3',
getHasAccessToPreviewModel: () => false,
});
const chain = resolvePolicyChain(config);

// Should downgrade to [Pro 2.5, Flash 2.5]
expect(chain).toHaveLength(2);
expect(chain[0]?.model).toBe('gemini-2.5-pro');
expect(chain[1]?.model).toBe('gemini-2.5-flash');
});
});

describe('buildFallbackPolicyContext', () => {
Expand Down
32 changes: 24 additions & 8 deletions packages/core/src/availability/policyHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
DEFAULT_GEMINI_MODEL,
PREVIEW_GEMINI_MODEL_AUTO,
isAutoModel,
isGemini3Model,
resolveModel,
} from '../config/models.js';
import type { ModelSelectionResult } from './modelAvailabilityService.js';
Expand All @@ -46,17 +47,32 @@ export function resolvePolicyChain(
const resolvedModel = resolveModel(modelFromConfig);
const isAutoPreferred = preferredModel ? isAutoModel(preferredModel) : false;
const isAutoConfigured = isAutoModel(configuredModel);
const hasAccessToPreview = config.getHasAccessToPreviewModel?.() ?? true;

if (resolvedModel === DEFAULT_GEMINI_FLASH_LITE_MODEL) {
chain = getFlashLitePolicyChain();
} else if (isAutoPreferred || isAutoConfigured) {
const previewEnabled =
preferredModel === PREVIEW_GEMINI_MODEL_AUTO ||
configuredModel === PREVIEW_GEMINI_MODEL_AUTO;
chain = getModelPolicyChain({
previewEnabled,
userTier: config.getUserTier(),
});
} else if (
isGemini3Model(resolvedModel) ||
isAutoPreferred ||
isAutoConfigured
) {
if (hasAccessToPreview) {
const previewEnabled =
isGemini3Model(resolvedModel) ||
preferredModel === PREVIEW_GEMINI_MODEL_AUTO ||
configuredModel === PREVIEW_GEMINI_MODEL_AUTO;
chain = getModelPolicyChain({
previewEnabled,
userTier: config.getUserTier(),
});
} else {
// User requested Gemini 3 but has no access. Proactively downgrade
// to the stable Gemini 2.5 chain.
return getModelPolicyChain({
previewEnabled: false,
userTier: config.getUserTier(),
});
}
} else {
chain = createSingleModelChain(modelFromConfig);
}
Expand Down
22 changes: 14 additions & 8 deletions packages/core/src/config/defaultModelConfigs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,12 @@ export const DEFAULT_MODEL_CONFIGS: ModelConfigServiceConfig = {
model: 'gemini-2.5-flash',
},
},
'gemini-3-flash-base': {
extends: 'base',
modelConfig: {
model: 'gemini-3-flash-preview',
},
},
classifier: {
extends: 'base',
modelConfig: {
Expand Down Expand Up @@ -151,15 +157,15 @@ export const DEFAULT_MODEL_CONFIGS: ModelConfigServiceConfig = {
},
},
'web-search': {
extends: 'gemini-2.5-flash-base',
extends: 'gemini-3-flash-base',
modelConfig: {
generateContentConfig: {
tools: [{ googleSearch: {} }],
},
},
},
'web-fetch': {
extends: 'gemini-2.5-flash-base',
extends: 'gemini-3-flash-base',
modelConfig: {
generateContentConfig: {
tools: [{ urlContext: {} }],
Expand All @@ -168,25 +174,25 @@ export const DEFAULT_MODEL_CONFIGS: ModelConfigServiceConfig = {
},
// TODO(joshualitt): During cleanup, make modelConfig optional.
'web-fetch-fallback': {
extends: 'gemini-2.5-flash-base',
extends: 'gemini-3-flash-base',
modelConfig: {},
},
'loop-detection': {
extends: 'gemini-2.5-flash-base',
extends: 'gemini-3-flash-base',
modelConfig: {},
},
'loop-detection-double-check': {
extends: 'base',
modelConfig: {
model: 'gemini-2.5-pro',
model: 'gemini-3-pro-preview',
},
},
'llm-edit-fixer': {
extends: 'gemini-2.5-flash-base',
extends: 'gemini-3-flash-base',
modelConfig: {},
},
'next-speaker-checker': {
extends: 'gemini-2.5-flash-base',
extends: 'gemini-3-flash-base',
modelConfig: {},
},
'chat-compression-3-pro': {
Expand Down Expand Up @@ -216,7 +222,7 @@ export const DEFAULT_MODEL_CONFIGS: ModelConfigServiceConfig = {
},
'chat-compression-default': {
modelConfig: {
model: 'gemini-2.5-pro',
model: 'gemini-3-pro-preview',
},
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@
"topP": 1
}
},
"gemini-3-flash-base": {
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
}
},
"classifier": {
"model": "gemini-2.5-flash-lite",
"generateContentConfig": {
Expand Down Expand Up @@ -153,7 +160,7 @@
}
},
"web-search": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1,
Expand All @@ -165,7 +172,7 @@
}
},
"web-fetch": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1,
Expand All @@ -177,35 +184,35 @@
}
},
"web-fetch-fallback": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
}
},
"loop-detection": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
}
},
"loop-detection-double-check": {
"model": "gemini-2.5-pro",
"model": "gemini-3-pro-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
}
},
"llm-edit-fixer": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
}
},
"next-speaker-checker": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
Expand All @@ -232,7 +239,7 @@
"generateContentConfig": {}
},
"chat-compression-default": {
"model": "gemini-2.5-pro",
"model": "gemini-3-pro-preview",
"generateContentConfig": {}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@
"topP": 1
}
},
"gemini-3-flash-base": {
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
}
},
"classifier": {
"model": "gemini-2.5-flash-lite",
"generateContentConfig": {
Expand Down Expand Up @@ -153,7 +160,7 @@
}
},
"web-search": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1,
Expand All @@ -165,7 +172,7 @@
}
},
"web-fetch": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1,
Expand All @@ -177,35 +184,35 @@
}
},
"web-fetch-fallback": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
}
},
"loop-detection": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
}
},
"loop-detection-double-check": {
"model": "gemini-2.5-pro",
"model": "gemini-3-pro-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
}
},
"llm-edit-fixer": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
}
},
"next-speaker-checker": {
"model": "gemini-2.5-flash",
"model": "gemini-3-flash-preview",
"generateContentConfig": {
"temperature": 0,
"topP": 1
Expand All @@ -232,7 +239,7 @@
"generateContentConfig": {}
},
"chat-compression-default": {
"model": "gemini-2.5-pro",
"model": "gemini-3-pro-preview",
"generateContentConfig": {}
}
}
Loading
Loading