From 11808ef7ed3735b848ed23ef8b3eb0f8cdb95775 Mon Sep 17 00:00:00 2001 From: Richie Foreman Date: Mon, 4 Aug 2025 16:41:58 -0400 Subject: [PATCH] fix(core): Allow model to be set from `settings.json` (#5527) --- packages/cli/src/config/config.test.ts | 62 ++++++++++++++++++++++++++ packages/cli/src/config/config.ts | 4 +- packages/cli/src/config/settings.ts | 2 + 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/config/config.test.ts b/packages/cli/src/config/config.test.ts index d8d463c2..431b1375 100644 --- a/packages/cli/src/config/config.test.ts +++ b/packages/cli/src/config/config.test.ts @@ -917,6 +917,68 @@ describe('loadCliConfig extensions', () => { }); }); +describe('loadCliConfig model selection', () => { + it('selects a model from settings.json if provided', async () => { + process.argv = ['node', 'script.js']; + const argv = await parseArguments(); + const config = await loadCliConfig( + { + model: 'gemini-9001-ultra', + }, + [], + 'test-session', + argv, + ); + + expect(config.getModel()).toBe('gemini-9001-ultra'); + }); + + it('uses the default gemini model if nothing is set', async () => { + process.argv = ['node', 'script.js']; // No model set. + const argv = await parseArguments(); + const config = await loadCliConfig( + { + // No model set. + }, + [], + 'test-session', + argv, + ); + + expect(config.getModel()).toBe('gemini-2.5-pro'); + }); + + it('always prefers model from argvs', async () => { + process.argv = ['node', 'script.js', '--model', 'gemini-8675309-ultra']; + const argv = await parseArguments(); + const config = await loadCliConfig( + { + model: 'gemini-9001-ultra', + }, + [], + 'test-session', + argv, + ); + + expect(config.getModel()).toBe('gemini-8675309-ultra'); + }); + + it('selects the model from argvs if provided', async () => { + process.argv = ['node', 'script.js', '--model', 'gemini-8675309-ultra']; + const argv = await parseArguments(); + const config = await loadCliConfig( + { + // No model provided via settings. + }, + [], + 'test-session', + argv, + ); + + expect(config.getModel()).toBe('gemini-8675309-ultra'); + }); +}); + describe('loadCliConfig ideModeFeature', () => { const originalArgv = process.argv; const originalEnv = { ...process.env }; diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index 9274b65e..38d59a4f 100644 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -79,7 +79,7 @@ export async function parseArguments(): Promise { alias: 'm', type: 'string', description: `Model`, - default: process.env.GEMINI_MODEL || DEFAULT_GEMINI_MODEL, + default: process.env.GEMINI_MODEL, }) .option('prompt', { alias: 'p', @@ -444,7 +444,7 @@ export async function loadCliConfig( cwd: process.cwd(), fileDiscoveryService: fileService, bugCommand: settings.bugCommand, - model: argv.model!, + model: argv.model || settings.model || DEFAULT_GEMINI_MODEL, extensionContextFilePaths, maxSessionTurns: settings.maxSessionTurns ?? -1, experimentalAcp: argv.experimentalAcp || false, diff --git a/packages/cli/src/config/settings.ts b/packages/cli/src/config/settings.ts index 05d4313f..20a7b14a 100644 --- a/packages/cli/src/config/settings.ts +++ b/packages/cli/src/config/settings.ts @@ -86,6 +86,8 @@ export interface Settings { bugCommand?: BugCommandSettings; checkpointing?: CheckpointingSettings; autoConfigureMaxOldSpaceSize?: boolean; + /** The model name to use (e.g 'gemini-9.0-pro') */ + model?: string; // Git-aware file filtering settings fileFiltering?: {