Skip to content

Commit 6340f11

Browse files
authored
Remove useModelRouter experimental flag (#13593)
1 parent 059929c commit 6340f11

21 files changed

+8
-336
lines changed

docs/cli/model-routing.md

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,6 @@ Here's how it works:
2525
`packages/cli/src/zed-integration/zedIntegration.ts` which checks if
2626
`isInFallbackMode()` is true.
2727

28-
## Configuration
29-
30-
Model routing is controlled by the `useModelRouter` setting in your
31-
`settings.json` file.
32-
33-
- **`"experimental.useModelRouter": true` (Default):** Enables the model
34-
routing/fallback feature.
35-
36-
- **`"experimental.useModelRouter": false`:** Disables the model
37-
routing/fallback feature. If a model fails, the CLI will not attempt to switch
38-
to a fallback model.
39-
4028
### Model Selection Precedence
4129

4230
The model used by Gemini CLI is determined by the following order of precedence:
@@ -50,7 +38,4 @@ The model used by Gemini CLI is determined by the following order of precedence:
5038
model specified in the `model.name` property of your `settings.json` file
5139
will be used.
5240
4. **Default Model:** If none of the above are set, the default model will be
53-
used. The default model is determined by the `useModelRouter` setting:
54-
- If `useModelRouter` is `true`, the default model is `"auto"`.
55-
- If `useModelRouter` is `false`, the default model is the standard Gemini
56-
model.
41+
used. The default model is `auto`

docs/cli/settings.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,7 @@ they appear in the UI.
106106

107107
### Experimental
108108

109-
| UI Label | Setting | Description | Default |
110-
| ----------------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------- | ------- |
111-
| Use Model Router | `experimental.useModelRouter` | Enable model routing to route requests to the best model based on complexity. | `true` |
112-
| Enable Codebase Investigator | `experimental.codebaseInvestigatorSettings.enabled` | Enable the Codebase Investigator agent. | `true` |
113-
| Codebase Investigator Max Num Turns | `experimental.codebaseInvestigatorSettings.maxNumTurns` | Maximum number of turns for the Codebase Investigator agent. | `10` |
109+
| UI Label | Setting | Description | Default |
110+
| ----------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------ | ------- |
111+
| Enable Codebase Investigator | `experimental.codebaseInvestigatorSettings.enabled` | Enable the Codebase Investigator agent. | `true` |
112+
| Codebase Investigator Max Num Turns | `experimental.codebaseInvestigatorSettings.maxNumTurns` | Maximum number of turns for the Codebase Investigator agent. | `10` |

docs/get-started/configuration.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -563,12 +563,6 @@ their corresponding top-level category object in your `settings.json` file.
563563
- **Default:** `false`
564564
- **Requires restart:** Yes
565565

566-
- **`experimental.useModelRouter`** (boolean):
567-
- **Description:** Enable model routing to route requests to the best model
568-
based on complexity.
569-
- **Default:** `true`
570-
- **Requires restart:** Yes
571-
572566
- **`experimental.codebaseInvestigatorSettings.enabled`** (boolean):
573567
- **Description:** Enable the Codebase Investigator agent.
574568
- **Default:** `true`

packages/cli/src/config/config.test.ts

Lines changed: 0 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import * as os from 'node:os';
99
import * as path from 'node:path';
1010
import {
1111
DEFAULT_FILE_FILTERING_OPTIONS,
12-
DEFAULT_GEMINI_MODEL,
13-
DEFAULT_GEMINI_MODEL_AUTO,
1412
OutputFormat,
1513
SHELL_TOOL_NAME,
1614
WRITE_FILE_TOOL_NAME,
@@ -1364,100 +1362,6 @@ describe('loadCliConfig model selection', () => {
13641362
});
13651363
});
13661364

1367-
describe('loadCliConfig model selection with model router', () => {
1368-
beforeEach(() => {
1369-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
1370-
});
1371-
1372-
afterEach(() => {
1373-
vi.resetAllMocks();
1374-
});
1375-
1376-
it('should use auto model when useModelRouter is true and no model is provided', async () => {
1377-
process.argv = ['node', 'script.js'];
1378-
const argv = await parseArguments({} as Settings);
1379-
const config = await loadCliConfig(
1380-
{
1381-
experimental: {
1382-
useModelRouter: true,
1383-
},
1384-
},
1385-
'test-session',
1386-
argv,
1387-
);
1388-
1389-
expect(config.getModel()).toBe(DEFAULT_GEMINI_MODEL_AUTO);
1390-
});
1391-
1392-
it('should use default model when useModelRouter is false and no model is provided', async () => {
1393-
process.argv = ['node', 'script.js'];
1394-
const argv = await parseArguments({} as Settings);
1395-
const config = await loadCliConfig(
1396-
{
1397-
experimental: {
1398-
useModelRouter: false,
1399-
},
1400-
},
1401-
'test-session',
1402-
argv,
1403-
);
1404-
1405-
expect(config.getModel()).toBe(DEFAULT_GEMINI_MODEL);
1406-
});
1407-
1408-
it('should prioritize argv over useModelRouter', async () => {
1409-
process.argv = ['node', 'script.js', '--model', 'gemini-from-argv'];
1410-
const argv = await parseArguments({} as Settings);
1411-
const config = await loadCliConfig(
1412-
{
1413-
experimental: {
1414-
useModelRouter: true,
1415-
},
1416-
},
1417-
'test-session',
1418-
argv,
1419-
);
1420-
1421-
expect(config.getModel()).toBe('gemini-from-argv');
1422-
});
1423-
1424-
it('should prioritize settings over useModelRouter', async () => {
1425-
process.argv = ['node', 'script.js'];
1426-
const argv = await parseArguments({} as Settings);
1427-
const config = await loadCliConfig(
1428-
{
1429-
experimental: {
1430-
useModelRouter: true,
1431-
},
1432-
model: {
1433-
name: 'gemini-from-settings',
1434-
},
1435-
},
1436-
'test-session',
1437-
argv,
1438-
);
1439-
1440-
expect(config.getModel()).toBe('gemini-from-settings');
1441-
});
1442-
1443-
it('should prioritize environment variable over useModelRouter', async () => {
1444-
process.argv = ['node', 'script.js'];
1445-
vi.stubEnv('GEMINI_MODEL', 'gemini-from-env');
1446-
const argv = await parseArguments({} as Settings);
1447-
const config = await loadCliConfig(
1448-
{
1449-
experimental: {
1450-
useModelRouter: true,
1451-
},
1452-
},
1453-
'test-session',
1454-
argv,
1455-
);
1456-
1457-
expect(config.getModel()).toBe('gemini-from-env');
1458-
});
1459-
});
1460-
14611365
describe('loadCliConfig folderTrust', () => {
14621366
beforeEach(() => {
14631367
vi.resetAllMocks();
@@ -1633,32 +1537,6 @@ describe('loadCliConfig useRipgrep', () => {
16331537
const config = await loadCliConfig(settings, 'test-session', argv);
16341538
expect(config.getUseRipgrep()).toBe(true);
16351539
});
1636-
1637-
describe('loadCliConfig useModelRouter', () => {
1638-
it('should be true by default when useModelRouter is not set in settings', async () => {
1639-
process.argv = ['node', 'script.js'];
1640-
const argv = await parseArguments({} as Settings);
1641-
const settings: Settings = {};
1642-
const config = await loadCliConfig(settings, 'test-session', argv);
1643-
expect(config.getUseModelRouter()).toBe(true);
1644-
});
1645-
1646-
it('should be true when useModelRouter is set to true in settings', async () => {
1647-
process.argv = ['node', 'script.js'];
1648-
const argv = await parseArguments({} as Settings);
1649-
const settings: Settings = { experimental: { useModelRouter: true } };
1650-
const config = await loadCliConfig(settings, 'test-session', argv);
1651-
expect(config.getUseModelRouter()).toBe(true);
1652-
});
1653-
1654-
it('should be false when useModelRouter is explicitly set to false in settings', async () => {
1655-
process.argv = ['node', 'script.js'];
1656-
const argv = await parseArguments({} as Settings);
1657-
const settings: Settings = { experimental: { useModelRouter: false } };
1658-
const config = await loadCliConfig(settings, 'test-session', argv);
1659-
expect(config.getUseModelRouter()).toBe(false);
1660-
});
1661-
});
16621540
});
16631541

16641542
describe('screenReader configuration', () => {

packages/cli/src/config/config.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
setGeminiMdFilename as setServerGeminiMdFilename,
1616
getCurrentGeminiMdFilename,
1717
ApprovalMode,
18-
DEFAULT_GEMINI_MODEL,
1918
DEFAULT_GEMINI_MODEL_AUTO,
2019
DEFAULT_GEMINI_EMBEDDING_MODEL,
2120
DEFAULT_FILE_FILTERING_OPTIONS,
@@ -580,10 +579,7 @@ export async function loadCliConfig(
580579
extraExcludes.length > 0 ? extraExcludes : undefined,
581580
);
582581

583-
const useModelRouter = settings.experimental?.useModelRouter ?? true;
584-
const defaultModel = useModelRouter
585-
? DEFAULT_GEMINI_MODEL_AUTO
586-
: DEFAULT_GEMINI_MODEL;
582+
const defaultModel = DEFAULT_GEMINI_MODEL_AUTO;
587583
const resolvedModel: string =
588584
argv.model ||
589585
process.env['GEMINI_MODEL'] ||
@@ -674,7 +670,6 @@ export async function loadCliConfig(
674670
output: {
675671
format: (argv.outputFormat ?? settings.output?.format) as OutputFormat,
676672
},
677-
useModelRouter,
678673
enableMessageBusIntegration,
679674
codebaseInvestigatorSettings:
680675
settings.experimental?.codebaseInvestigatorSettings,

packages/cli/src/config/settingsSchema.test.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -345,21 +345,6 @@ describe('SettingsSchema', () => {
345345
getSettingsSchema().general.properties.previewFeatures.description,
346346
).toBe('Enable preview features (e.g., preview models).');
347347
});
348-
349-
it('should have useModelRouter setting in schema', () => {
350-
expect(
351-
getSettingsSchema().experimental.properties.useModelRouter,
352-
).toBeDefined();
353-
expect(
354-
getSettingsSchema().experimental.properties.useModelRouter.type,
355-
).toBe('boolean');
356-
expect(
357-
getSettingsSchema().experimental.properties.useModelRouter.category,
358-
).toBe('Experimental');
359-
expect(
360-
getSettingsSchema().experimental.properties.useModelRouter.default,
361-
).toBe(true);
362-
});
363348
});
364349

365350
it('has JSON schema definitions for every referenced ref', () => {

packages/cli/src/config/settingsSchema.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,16 +1281,6 @@ const SETTINGS_SCHEMA = {
12811281
'Enables extension loading/unloading within the CLI session.',
12821282
showInDialog: false,
12831283
},
1284-
useModelRouter: {
1285-
type: 'boolean',
1286-
label: 'Use Model Router',
1287-
category: 'Experimental',
1288-
requiresRestart: true,
1289-
default: true,
1290-
description:
1291-
'Enable model routing to route requests to the best model based on complexity.',
1292-
showInDialog: true,
1293-
},
12941284
codebaseInvestigatorSettings: {
12951285
type: 'object',
12961286
label: 'Codebase Investigator Settings',

packages/cli/src/services/BuiltinCommandLoader.test.ts

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ describe('BuiltinCommandLoader', () => {
9595
vi.clearAllMocks();
9696
mockConfig = {
9797
getFolderTrust: vi.fn().mockReturnValue(true),
98-
getUseModelRouter: () => false,
9998
getEnableMessageBusIntegration: () => false,
10099
getEnableExtensionReloading: () => false,
101100
} as unknown as Config;
@@ -168,28 +167,6 @@ describe('BuiltinCommandLoader', () => {
168167
expect(permissionsCmd).toBeUndefined();
169168
});
170169

171-
it('should include modelCommand when getUseModelRouter is true', async () => {
172-
const mockConfigWithModelRouter = {
173-
...mockConfig,
174-
getUseModelRouter: () => true,
175-
} as unknown as Config;
176-
const loader = new BuiltinCommandLoader(mockConfigWithModelRouter);
177-
const commands = await loader.loadCommands(new AbortController().signal);
178-
const modelCmd = commands.find((c) => c.name === 'model');
179-
expect(modelCmd).toBeDefined();
180-
});
181-
182-
it('should not include modelCommand when getUseModelRouter is false', async () => {
183-
const mockConfigWithoutModelRouter = {
184-
...mockConfig,
185-
getUseModelRouter: () => false,
186-
} as unknown as Config;
187-
const loader = new BuiltinCommandLoader(mockConfigWithoutModelRouter);
188-
const commands = await loader.loadCommands(new AbortController().signal);
189-
const modelCmd = commands.find((c) => c.name === 'model');
190-
expect(modelCmd).toBeUndefined();
191-
});
192-
193170
it('should include policies command when message bus integration is enabled', async () => {
194171
const mockConfigWithMessageBus = {
195172
...mockConfig,
@@ -220,7 +197,6 @@ describe('BuiltinCommandLoader profile', () => {
220197
vi.resetModules();
221198
mockConfig = {
222199
getFolderTrust: vi.fn().mockReturnValue(false),
223-
getUseModelRouter: () => false,
224200
getCheckpointingEnabled: () => false,
225201
getEnableMessageBusIntegration: () => false,
226202
getEnableExtensionReloading: () => false,

packages/cli/src/services/BuiltinCommandLoader.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export class BuiltinCommandLoader implements ICommandLoader {
7373
initCommand,
7474
mcpCommand,
7575
memoryCommand,
76-
...(this.config?.getUseModelRouter() ? [modelCommand] : []),
76+
modelCommand,
7777
...(this.config?.getFolderTrust() ? [permissionsCommand] : []),
7878
privacyCommand,
7979
...(this.config?.getEnableMessageBusIntegration()

packages/cli/src/ui/components/ModelDialog.test.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ const renderComponent = (
5151
getDebugMode: vi.fn(() => false),
5252
getContentGeneratorConfig: vi.fn(() => ({ authType: 'mock' })),
5353
getUseSmartEdit: vi.fn(() => false),
54-
getUseModelRouter: vi.fn(() => false),
5554
getProxy: vi.fn(() => undefined),
5655
isInteractive: vi.fn(() => false),
5756

0 commit comments

Comments
 (0)