From d93455414d3082b824604fa71f925a698587ba52 Mon Sep 17 00:00:00 2001 From: davidapierce Date: Mon, 11 May 2026 17:09:04 +0000 Subject: [PATCH] added release channel plumbing and auto 2.5 and 3 parity for deprecated auto modes. --- .../src/availability/policyHelpers.test.ts | 19 +++++++++++- .../core/src/availability/policyHelpers.ts | 1 + packages/core/src/config/config.ts | 5 ++++ .../core/src/config/defaultModelConfigs.ts | 29 +++++++++++++++++++ packages/core/src/config/models.ts | 2 ++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/packages/core/src/availability/policyHelpers.test.ts b/packages/core/src/availability/policyHelpers.test.ts index 945de646e0..7ea6bc17d9 100644 --- a/packages/core/src/availability/policyHelpers.test.ts +++ b/packages/core/src/availability/policyHelpers.test.ts @@ -37,7 +37,11 @@ const createMockConfig = (overrides: Partial = {}): Config => { return useGemini31 && authType === AuthType.USE_GEMINI; }, getContentGeneratorConfig: () => ({ authType: undefined }), + getHasAccessToPreviewModel: () => true, getMaxAttemptsPerTurn: () => 3, + getExperimentalDynamicModelConfiguration: () => false, + getReleaseChannel: () => 'preview', + modelConfigService: new ModelConfigService(DEFAULT_MODEL_CONFIGS), ...overrides, } as unknown as Config; return config; @@ -186,6 +190,7 @@ describe('policyHelpers', () => { const testCases = [ { name: 'Default Auto', model: DEFAULT_GEMINI_MODEL_AUTO }, { name: 'Gemini 3 Auto', model: 'auto-gemini-3' }, + { name: 'Unified Auto', model: 'auto' }, { name: 'Flash Lite', model: DEFAULT_GEMINI_FLASH_LITE_MODEL }, { name: 'Gemini 3 Auto (3.1 Enabled)', @@ -214,7 +219,18 @@ describe('policyHelpers', () => { ]; testCases.forEach( - ({ name, model, useGemini31, hasAccess, authType, wrapsAround }) => { + ({ + name, + model, + useGemini31, + hasAccess, + authType, + wrapsAround, + ...rest + }) => { + const releaseChannel = (rest as Record)[ + 'releaseChannel' + ] as string | undefined; it(`achieves parity for: ${name}`, () => { const createBaseConfig = (dynamic: boolean) => createMockConfig({ @@ -224,6 +240,7 @@ describe('policyHelpers', () => { getGemini31FlashLiteLaunchedSync: () => false, getHasAccessToPreviewModel: () => hasAccess ?? true, getContentGeneratorConfig: () => ({ authType }), + getReleaseChannel: () => releaseChannel ?? 'preview', modelConfigService: new ModelConfigService(DEFAULT_MODEL_CONFIGS), }); diff --git a/packages/core/src/availability/policyHelpers.ts b/packages/core/src/availability/policyHelpers.ts index 5d65a7598e..7a4958fdb1 100644 --- a/packages/core/src/availability/policyHelpers.ts +++ b/packages/core/src/availability/policyHelpers.ts @@ -71,6 +71,7 @@ export function resolvePolicyChain( useGemini3_1: useGemini31, useGemini3_1FlashLite: useGemini31FlashLite, useCustomTools: useCustomToolModel, + releaseChannel: config.getReleaseChannel?.(), }; if (resolvedModel === DEFAULT_GEMINI_FLASH_LITE_MODEL) { diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index 42959cbb5c..d8d92ed6c5 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -442,6 +442,7 @@ export interface ExtensionInstallMetadata { allowPreRelease?: boolean; } +import { getChannelFromVersion } from '../utils/channel.js'; import { DEFAULT_MAX_ATTEMPTS } from '../utils/retry.js'; import { DEFAULT_FILE_FILTERING_OPTIONS, @@ -2784,6 +2785,10 @@ export class Config implements McpContext, AgentLoopContext { return this.dynamicModelConfiguration; } + getReleaseChannel(): string { + return getChannelFromVersion(this._clientVersion); + } + getPendingIncludeDirectories(): string[] { return this.pendingIncludeDirectories; } diff --git a/packages/core/src/config/defaultModelConfigs.ts b/packages/core/src/config/defaultModelConfigs.ts index 44c9787c72..2af712babb 100644 --- a/packages/core/src/config/defaultModelConfigs.ts +++ b/packages/core/src/config/defaultModelConfigs.ts @@ -387,6 +387,18 @@ export const DEFAULT_MODEL_CONFIGS: ModelConfigServiceConfig = { isVisible: false, features: { thinking: false, multimodalToolUse: false }, }, + 'auto-gemini-3': { + tier: 'auto', + family: 'gemini-3', + isPreview: true, + isVisible: false, + }, + 'auto-gemini-2.5': { + tier: 'auto', + family: 'gemini-2.5', + isPreview: false, + isVisible: false, + }, }, modelIdResolutions: { 'gemma-4-31b-it': { @@ -491,6 +503,23 @@ export const DEFAULT_MODEL_CONFIGS: ModelConfigServiceConfig = { }, ], }, + 'auto-gemini-3': { + default: 'gemini-3-pro-preview', + contexts: [ + { condition: { hasAccessToPreview: false }, target: 'gemini-2.5-pro' }, + { + condition: { useGemini3_1: true, useCustomTools: true }, + target: 'gemini-3.1-pro-preview-customtools', + }, + { + condition: { useGemini3_1: true }, + target: 'gemini-3.1-pro-preview', + }, + ], + }, + 'auto-gemini-2.5': { + default: 'gemini-2.5-pro', + }, }, classifierIdResolutions: { flash: { diff --git a/packages/core/src/config/models.ts b/packages/core/src/config/models.ts index 07de23d37e..d195c3479b 100644 --- a/packages/core/src/config/models.ts +++ b/packages/core/src/config/models.ts @@ -49,6 +49,7 @@ export interface IModelConfigService { export interface ModelCapabilityContext { readonly modelConfigService: IModelConfigService; getExperimentalDynamicModelConfiguration(): boolean; + getReleaseChannel?(): string; } export const PREVIEW_GEMINI_MODEL = 'gemini-3-pro-preview'; @@ -125,6 +126,7 @@ export function resolveModel( useGemini3_1FlashLite, useCustomTools: useCustomToolModel, hasAccessToPreview, + releaseChannel: config.getReleaseChannel?.(), }); if (!hasAccessToPreview && isPreviewModel(resolved, config)) {