diff --git a/packages/cli/src/ui/components/ModelDialog.test.tsx b/packages/cli/src/ui/components/ModelDialog.test.tsx
index f636db7c3..7e05bdc43 100644
--- a/packages/cli/src/ui/components/ModelDialog.test.tsx
+++ b/packages/cli/src/ui/components/ModelDialog.test.tsx
@@ -12,13 +12,10 @@ import { DescriptiveRadioButtonSelect } from './shared/DescriptiveRadioButtonSel
import { ConfigContext } from '../contexts/ConfigContext.js';
import { SettingsContext } from '../contexts/SettingsContext.js';
import type { Config } from '@qwen-code/qwen-code-core';
-import { AuthType } from '@qwen-code/qwen-code-core';
+import { AuthType, DEFAULT_QWEN_MODEL } from '@qwen-code/qwen-code-core';
import type { LoadedSettings } from '../../config/settings.js';
import { SettingScope } from '../../config/settings.js';
-import {
- getFilteredQwenModels,
- MAINLINE_CODER,
-} from '../models/availableModels.js';
+import { getFilteredQwenModels } from '../models/availableModels.js';
vi.mock('../hooks/useKeypress.js', () => ({
useKeypress: vi.fn(),
@@ -61,7 +58,7 @@ const renderComponent = (
const mockConfig = {
// --- Functions used by ModelDialog ---
- getModel: vi.fn(() => MAINLINE_CODER),
+ getModel: vi.fn(() => DEFAULT_QWEN_MODEL),
setModel: vi.fn().mockResolvedValue(undefined),
switchModel: vi.fn().mockResolvedValue(undefined),
getAuthType: vi.fn(() => 'qwen-oauth'),
@@ -80,7 +77,7 @@ const renderComponent = (
getDebugMode: vi.fn(() => false),
getContentGeneratorConfig: vi.fn(() => ({
authType: AuthType.QWEN_OAUTH,
- model: MAINLINE_CODER,
+ model: DEFAULT_QWEN_MODEL,
})),
getUseModelRouter: vi.fn(() => false),
getProxy: vi.fn(() => undefined),
@@ -131,13 +128,13 @@ describe('', () => {
expect(props.items).toHaveLength(getFilteredQwenModels().length);
// coder-model is the only model and it has vision capability
expect(props.items[0].value).toBe(
- `${AuthType.QWEN_OAUTH}::${MAINLINE_CODER}`,
+ `${AuthType.QWEN_OAUTH}::${DEFAULT_QWEN_MODEL}`,
);
expect(props.showNumbers).toBe(true);
});
it('initializes with the model from ConfigContext', () => {
- const mockGetModel = vi.fn(() => MAINLINE_CODER);
+ const mockGetModel = vi.fn(() => DEFAULT_QWEN_MODEL);
renderComponent(
{},
{
@@ -150,7 +147,9 @@ describe('', () => {
expect(mockGetModel).toHaveBeenCalled();
// Calculate expected index dynamically based on model list
const qwenModels = getFilteredQwenModels();
- const expectedIndex = qwenModels.findIndex((m) => m.id === MAINLINE_CODER);
+ const expectedIndex = qwenModels.findIndex(
+ (m) => m.id === DEFAULT_QWEN_MODEL,
+ );
expect(mockedSelect).toHaveBeenCalledWith(
expect.objectContaining({
initialIndex: expectedIndex,
@@ -183,7 +182,7 @@ describe('', () => {
expect(mockGetModel).toHaveBeenCalled();
- // When getModel returns undefined, preferredModel falls back to MAINLINE_CODER
+ // When getModel returns undefined, preferredModel falls back to DEFAULT_QWEN_MODEL
// which has index 0, so initialIndex should be 0
expect(mockedSelect).toHaveBeenCalledWith(
expect.objectContaining({
@@ -214,17 +213,17 @@ describe('', () => {
const childOnSelect = mockedSelect.mock.calls[0][0].onSelect;
expect(childOnSelect).toBeDefined();
- await childOnSelect(`${AuthType.QWEN_OAUTH}::${MAINLINE_CODER}`);
+ await childOnSelect(`${AuthType.QWEN_OAUTH}::${DEFAULT_QWEN_MODEL}`);
expect(mockConfig?.switchModel).toHaveBeenCalledWith(
AuthType.QWEN_OAUTH,
- MAINLINE_CODER,
+ DEFAULT_QWEN_MODEL,
undefined,
);
expect(mockSettings.setValue).toHaveBeenCalledWith(
SettingScope.User,
'model.name',
- MAINLINE_CODER,
+ DEFAULT_QWEN_MODEL,
);
expect(mockSettings.setValue).toHaveBeenCalledWith(
SettingScope.User,
@@ -256,7 +255,7 @@ describe('', () => {
getModel: vi.fn(() => 'gpt-4'),
getContentGeneratorConfig: vi.fn(() => ({
authType: AuthType.QWEN_OAUTH,
- model: MAINLINE_CODER,
+ model: DEFAULT_QWEN_MODEL,
})),
// Add switchModel to the mock object (not the type)
switchModel,
@@ -270,17 +269,17 @@ describe('', () => {
);
const childOnSelect = mockedSelect.mock.calls[0][0].onSelect;
- await childOnSelect(`${AuthType.QWEN_OAUTH}::${MAINLINE_CODER}`);
+ await childOnSelect(`${AuthType.QWEN_OAUTH}::${DEFAULT_QWEN_MODEL}`);
expect(switchModel).toHaveBeenCalledWith(
AuthType.QWEN_OAUTH,
- MAINLINE_CODER,
+ DEFAULT_QWEN_MODEL,
{ requireCachedCredentials: true },
);
expect(mockSettings.setValue).toHaveBeenCalledWith(
SettingScope.User,
'model.name',
- MAINLINE_CODER,
+ DEFAULT_QWEN_MODEL,
);
expect(mockSettings.setValue).toHaveBeenCalledWith(
SettingScope.User,
@@ -329,7 +328,7 @@ describe('', () => {
});
it('updates initialIndex when config context changes', () => {
- const mockGetModel = vi.fn(() => MAINLINE_CODER);
+ const mockGetModel = vi.fn(() => DEFAULT_QWEN_MODEL);
const mockGetAuthType = vi.fn(() => 'qwen-oauth');
const mockSettings = {
isTrusted: true,
@@ -362,10 +361,10 @@ describe('', () => {
,
);
- // MAINLINE_CODER (qwen3.5-plus) is at index 0
+ // DEFAULT_QWEN_MODEL (coder-model) is at index 0
expect(mockedSelect.mock.calls[0][0].initialIndex).toBe(0);
- mockGetModel.mockReturnValue(MAINLINE_CODER);
+ mockGetModel.mockReturnValue(DEFAULT_QWEN_MODEL);
const newMockConfig = {
getModel: mockGetModel,
getAuthType: mockGetAuthType,
@@ -390,10 +389,10 @@ describe('', () => {
// Should be called at least twice: initial render + re-render after context change
expect(mockedSelect).toHaveBeenCalledTimes(2);
- // Calculate expected index for MAINLINE_CODER dynamically
+ // Calculate expected index for DEFAULT_QWEN_MODEL dynamically
const qwenModels = getFilteredQwenModels();
const expectedCoderIndex = qwenModels.findIndex(
- (m) => m.id === MAINLINE_CODER,
+ (m) => m.id === DEFAULT_QWEN_MODEL,
);
expect(mockedSelect.mock.calls[1][0].initialIndex).toBe(expectedCoderIndex);
});
diff --git a/packages/cli/src/ui/components/ModelDialog.tsx b/packages/cli/src/ui/components/ModelDialog.tsx
index 8c102890f..8fdbbe38d 100644
--- a/packages/cli/src/ui/components/ModelDialog.tsx
+++ b/packages/cli/src/ui/components/ModelDialog.tsx
@@ -11,6 +11,7 @@ import {
AuthType,
ModelSlashCommandEvent,
logModelSlashCommand,
+ MAINLINE_CODER_MODEL,
type AvailableModel as CoreAvailableModel,
type ContentGeneratorConfig,
type ContentGeneratorConfigSource,
@@ -22,7 +23,6 @@ import { DescriptiveRadioButtonSelect } from './shared/DescriptiveRadioButtonSel
import { ConfigContext } from '../contexts/ConfigContext.js';
import { UIStateContext, type UIState } from '../contexts/UIStateContext.js';
import { useSettings } from '../contexts/SettingsContext.js';
-import { MAINLINE_CODER } from '../models/availableModels.js';
import { getPersistScopeForModelSelection } from '../../config/modelProvidersScope.js';
import { t } from '../../i18n/index.js';
@@ -293,7 +293,7 @@ export function ModelDialog({ onClose }: ModelDialogProps): React.JSX.Element {
[availableModelEntries],
);
- const preferredModelId = config?.getModel() || MAINLINE_CODER;
+ const preferredModelId = config?.getModel() || MAINLINE_CODER_MODEL;
// Check if current model is a runtime model
// Runtime snapshot ID is already in $runtime|${authType}|${modelId} format
const activeRuntimeSnapshot = config?.getActiveRuntimeModelSnapshot?.();
diff --git a/packages/cli/src/ui/models/availableModels.ts b/packages/cli/src/ui/models/availableModels.ts
index 6830221a3..def4f12a7 100644
--- a/packages/cli/src/ui/models/availableModels.ts
+++ b/packages/cli/src/ui/models/availableModels.ts
@@ -6,7 +6,6 @@
import {
AuthType,
- DEFAULT_QWEN_MODEL,
type Config,
type AvailableModel as CoreAvailableModel,
QWEN_OAUTH_MODELS,
@@ -20,9 +19,6 @@ export type AvailableModel = {
isVision?: boolean;
};
-// Re-export constant from core for backwards compatibility
-export { DEFAULT_QWEN_MODEL as MAINLINE_CODER };
-
const CACHED_QWEN_OAUTH_MODELS: AvailableModel[] = QWEN_OAUTH_MODELS.map(
(model) => ({
id: model.id,
diff --git a/packages/core/src/config/models.ts b/packages/core/src/config/models.ts
index a07dec7ce..a507b7fa7 100644
--- a/packages/core/src/config/models.ts
+++ b/packages/core/src/config/models.ts
@@ -7,3 +7,4 @@
export const DEFAULT_QWEN_MODEL = 'coder-model';
export const DEFAULT_QWEN_FLASH_MODEL = 'coder-model';
export const DEFAULT_QWEN_EMBEDDING_MODEL = 'text-embedding-v4';
+export const MAINLINE_CODER_MODEL = 'qwen3.5-plus';
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index c76fd2f8d..de3f9f96d 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -18,6 +18,7 @@ export {
DEFAULT_QWEN_MODEL,
DEFAULT_QWEN_FLASH_MODEL,
DEFAULT_QWEN_EMBEDDING_MODEL,
+ MAINLINE_CODER_MODEL,
} from './config/models.js';
export {
type AvailableModel,
diff --git a/packages/core/src/models/constants.ts b/packages/core/src/models/constants.ts
index c3295e684..025e3b9cf 100644
--- a/packages/core/src/models/constants.ts
+++ b/packages/core/src/models/constants.ts
@@ -4,7 +4,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-import { DEFAULT_QWEN_MODEL } from '../config/models.js';
+import { DEFAULT_QWEN_MODEL, MAINLINE_CODER_MODEL } from '../config/models.js';
import type { ModelConfig } from './types.js';
@@ -88,7 +88,7 @@ export const AUTH_ENV_MAPPINGS = {
} as const satisfies Record;
export const DEFAULT_MODELS = {
- openai: DEFAULT_QWEN_MODEL,
+ openai: MAINLINE_CODER_MODEL,
'qwen-oauth': DEFAULT_QWEN_MODEL,
} as Partial>;
diff --git a/packages/core/src/models/modelConfigResolver.test.ts b/packages/core/src/models/modelConfigResolver.test.ts
index 3dfacc3e7..978949b2c 100644
--- a/packages/core/src/models/modelConfigResolver.test.ts
+++ b/packages/core/src/models/modelConfigResolver.test.ts
@@ -10,7 +10,7 @@ import {
validateModelConfig,
} from './modelConfigResolver.js';
import { AuthType } from '../core/contentGenerator.js';
-import { DEFAULT_QWEN_MODEL } from '../config/models.js';
+import { DEFAULT_QWEN_MODEL, MAINLINE_CODER_MODEL } from '../config/models.js';
describe('modelConfigResolver', () => {
describe('resolveModelConfig', () => {
@@ -95,7 +95,7 @@ describe('modelConfigResolver', () => {
},
});
- expect(result.config.model).toBe('coder-model');
+ expect(result.config.model).toBe(MAINLINE_CODER_MODEL);
expect(result.sources['model'].kind).toBe('default');
});