Skip to content

Commit 1a5ab35

Browse files
fix(patch): cherry-pick aa9163d to release/v0.30.0-preview.3-pr-19991 to patch version v0.30.0-preview.3 and create version 0.30.0-preview.4 (google-gemini#20040)
Co-authored-by: Sehoon Shon <sshon@google.com>
1 parent ee6f1bd commit 1a5ab35

4 files changed

Lines changed: 73 additions & 7 deletions

File tree

packages/core/src/availability/policyCatalog.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import {
1212
} from './policyCatalog.js';
1313
import {
1414
DEFAULT_GEMINI_MODEL,
15+
PREVIEW_GEMINI_3_1_CUSTOM_TOOLS_MODEL,
16+
PREVIEW_GEMINI_3_1_MODEL,
1517
PREVIEW_GEMINI_MODEL,
1618
} from '../config/models.js';
1719

@@ -22,6 +24,27 @@ describe('policyCatalog', () => {
2224
expect(chain).toHaveLength(2);
2325
});
2426

27+
it('returns Gemini 3.1 chain when useGemini31 is true', () => {
28+
const chain = getModelPolicyChain({
29+
previewEnabled: true,
30+
useGemini31: true,
31+
});
32+
expect(chain[0]?.model).toBe(PREVIEW_GEMINI_3_1_MODEL);
33+
expect(chain).toHaveLength(2);
34+
expect(chain[1]?.model).toBe('gemini-3-flash-preview');
35+
});
36+
37+
it('returns Gemini 3.1 Custom Tools chain when useGemini31 and useCustomToolModel are true', () => {
38+
const chain = getModelPolicyChain({
39+
previewEnabled: true,
40+
useGemini31: true,
41+
useCustomToolModel: true,
42+
});
43+
expect(chain[0]?.model).toBe(PREVIEW_GEMINI_3_1_CUSTOM_TOOLS_MODEL);
44+
expect(chain).toHaveLength(2);
45+
expect(chain[1]?.model).toBe('gemini-3-flash-preview');
46+
});
47+
2548
it('returns default chain when preview disabled', () => {
2649
const chain = getModelPolicyChain({ previewEnabled: false });
2750
expect(chain[0]?.model).toBe(DEFAULT_GEMINI_MODEL);

packages/core/src/availability/policyCatalog.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
DEFAULT_GEMINI_MODEL,
1717
PREVIEW_GEMINI_FLASH_MODEL,
1818
PREVIEW_GEMINI_MODEL,
19+
resolveModel,
1920
} from '../config/models.js';
2021
import type { UserTierId } from '../code_assist/types.js';
2122

@@ -28,6 +29,8 @@ type PolicyConfig = Omit<ModelPolicy, 'actions' | 'stateTransitions'> & {
2829
export interface ModelPolicyOptions {
2930
previewEnabled: boolean;
3031
userTier?: UserTierId;
32+
useGemini31?: boolean;
33+
useCustomToolModel?: boolean;
3134
}
3235

3336
const DEFAULT_ACTIONS: ModelPolicyActionMap = {
@@ -56,11 +59,6 @@ const DEFAULT_CHAIN: ModelPolicyChain = [
5659
definePolicy({ model: DEFAULT_GEMINI_FLASH_MODEL, isLastResort: true }),
5760
];
5861

59-
const PREVIEW_CHAIN: ModelPolicyChain = [
60-
definePolicy({ model: PREVIEW_GEMINI_MODEL }),
61-
definePolicy({ model: PREVIEW_GEMINI_FLASH_MODEL, isLastResort: true }),
62-
];
63-
6462
const FLASH_LITE_CHAIN: ModelPolicyChain = [
6563
definePolicy({
6664
model: DEFAULT_GEMINI_FLASH_LITE_MODEL,
@@ -84,7 +82,15 @@ export function getModelPolicyChain(
8482
options: ModelPolicyOptions,
8583
): ModelPolicyChain {
8684
if (options.previewEnabled) {
87-
return cloneChain(PREVIEW_CHAIN);
85+
const previewModel = resolveModel(
86+
PREVIEW_GEMINI_MODEL,
87+
options.useGemini31,
88+
options.useCustomToolModel,
89+
);
90+
return [
91+
definePolicy({ model: previewModel }),
92+
definePolicy({ model: PREVIEW_GEMINI_FLASH_MODEL, isLastResort: true }),
93+
];
8894
}
8995

9096
return cloneChain(DEFAULT_CHAIN);

packages/core/src/availability/policyHelpers.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@ import type { Config } from '../config/config.js';
1515
import {
1616
DEFAULT_GEMINI_FLASH_LITE_MODEL,
1717
DEFAULT_GEMINI_MODEL_AUTO,
18+
PREVIEW_GEMINI_3_1_CUSTOM_TOOLS_MODEL,
19+
PREVIEW_GEMINI_3_1_MODEL,
1820
} from '../config/models.js';
21+
import { AuthType } from '../core/contentGenerator.js';
1922

2023
const createMockConfig = (overrides: Partial<Config> = {}): Config =>
2124
({
2225
getUserTier: () => undefined,
2326
getModel: () => 'gemini-2.5-pro',
27+
getGemini31LaunchedSync: () => false,
28+
getContentGeneratorConfig: () => ({ authType: undefined }),
2429
...overrides,
2530
}) as unknown as Config;
2631

@@ -128,6 +133,27 @@ describe('policyHelpers', () => {
128133
expect(chain[0]?.model).toBe('gemini-2.5-pro');
129134
expect(chain[1]?.model).toBe('gemini-2.5-flash');
130135
});
136+
137+
it('returns Gemini 3.1 Pro chain when launched and auto-gemini-3 requested', () => {
138+
const config = createMockConfig({
139+
getModel: () => 'auto-gemini-3',
140+
getGemini31LaunchedSync: () => true,
141+
});
142+
const chain = resolvePolicyChain(config);
143+
expect(chain[0]?.model).toBe(PREVIEW_GEMINI_3_1_MODEL);
144+
expect(chain[1]?.model).toBe('gemini-3-flash-preview');
145+
});
146+
147+
it('returns Gemini 3.1 Pro Custom Tools chain when launched, auth is Gemini, and auto-gemini-3 requested', () => {
148+
const config = createMockConfig({
149+
getModel: () => 'auto-gemini-3',
150+
getGemini31LaunchedSync: () => true,
151+
getContentGeneratorConfig: () => ({ authType: AuthType.USE_GEMINI }),
152+
});
153+
const chain = resolvePolicyChain(config);
154+
expect(chain[0]?.model).toBe(PREVIEW_GEMINI_3_1_CUSTOM_TOOLS_MODEL);
155+
expect(chain[1]?.model).toBe('gemini-3-flash-preview');
156+
});
131157
});
132158

133159
describe('buildFallbackPolicyContext', () => {

packages/core/src/availability/policyHelpers.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import type { GenerateContentConfig } from '@google/genai';
88
import type { Config } from '../config/config.js';
9+
import { AuthType } from '../core/contentGenerator.js';
910
import type {
1011
FailureKind,
1112
FallbackAction,
@@ -44,9 +45,15 @@ export function resolvePolicyChain(
4445
const configuredModel = config.getModel();
4546

4647
let chain;
48+
const useGemini31 = config.getGemini31LaunchedSync?.() ?? false;
49+
const useCustomToolModel =
50+
useGemini31 &&
51+
config.getContentGeneratorConfig?.()?.authType === AuthType.USE_GEMINI;
52+
4753
const resolvedModel = resolveModel(
4854
modelFromConfig,
49-
config.getGemini31LaunchedSync?.() ?? false,
55+
useGemini31,
56+
useCustomToolModel,
5057
);
5158
const isAutoPreferred = preferredModel ? isAutoModel(preferredModel) : false;
5259
const isAutoConfigured = isAutoModel(configuredModel);
@@ -67,13 +74,17 @@ export function resolvePolicyChain(
6774
chain = getModelPolicyChain({
6875
previewEnabled,
6976
userTier: config.getUserTier(),
77+
useGemini31,
78+
useCustomToolModel,
7079
});
7180
} else {
7281
// User requested Gemini 3 but has no access. Proactively downgrade
7382
// to the stable Gemini 2.5 chain.
7483
return getModelPolicyChain({
7584
previewEnabled: false,
7685
userTier: config.getUserTier(),
86+
useGemini31,
87+
useCustomToolModel,
7788
});
7889
}
7990
} else {

0 commit comments

Comments
 (0)