diff --git a/src/commands/provider.ts b/src/commands/provider.ts index 8a3066e50..e7b0ff101 100644 --- a/src/commands/provider.ts +++ b/src/commands/provider.ts @@ -4,6 +4,7 @@ import { getAPIProvider } from '../utils/model/providers.js' import { updateSettingsForSource } from '../utils/settings/settings.js' import { getSettings_DEPRECATED } from '../utils/settings/settings.js' import { applyConfigEnvironmentVariables } from '../utils/managedEnv.js' +import { getDefaultSonnetModel, getDefaultOpusModel, getDefaultHaikuModel } from '../utils/model/model.js' function getEnvVarForProvider(provider: string): string { switch (provider) { @@ -43,6 +44,28 @@ const call: LocalCommandCall = async (args, context) => { return { type: 'text', value: `Current API provider: ${current}` } } + // Helper function to set default model based on provider + const setDefaultModel = (provider: string) => { + const settings = getSettings_DEPRECATED() || {} + const currentModel = settings.model + + // Only set default if no model has been explicitly set + if (!currentModel) { + let defaultModel: string + switch (provider) { + case 'anthropic': + defaultModel = getDefaultSonnetModel() + break + case 'openai': + case 'gemini': + case 'grok': + default: + defaultModel = getDefaultSonnetModel() + } + updateSettingsForSource('userSettings', { model: defaultModel }) + } + } + // unset - clear settings, fallback to env vars if (arg === 'unset') { updateSettingsForSource('userSettings', { modelType: undefined }) @@ -84,6 +107,7 @@ const call: LocalCommandCall = async (args, context) => { const hasUrl = !!mergedEnv.OPENAI_BASE_URL if (!hasKey || !hasUrl) { updateSettingsForSource('userSettings', { modelType: 'openai' }) + setDefaultModel('openai') const missing = [] if (!hasKey) missing.push('OPENAI_API_KEY') if (!hasUrl) missing.push('OPENAI_BASE_URL') @@ -100,6 +124,7 @@ const call: LocalCommandCall = async (args, context) => { const hasKey = !!(mergedEnv.GROK_API_KEY || mergedEnv.XAI_API_KEY) if (!hasKey) { updateSettingsForSource('userSettings', { modelType: 'grok' }) + setDefaultModel('grok') return { type: 'text', value: `Switched to Grok provider.\nWarning: Missing env var: GROK_API_KEY (or XAI_API_KEY)\nConfigure it via settings.json env or set manually.`, @@ -114,6 +139,7 @@ const call: LocalCommandCall = async (args, context) => { // GEMINI_BASE_URL is optional (has default) if (!hasKey) { updateSettingsForSource('userSettings', { modelType: 'gemini' }) + setDefaultModel('gemini') return { type: 'text', value: `Switched to Gemini provider.\nWarning: Missing env var: GEMINI_API_KEY\nConfigure it via /login or set manually.`, @@ -135,6 +161,8 @@ const call: LocalCommandCall = async (args, context) => { delete process.env.CLAUDE_CODE_USE_COSTRICT // Update settings.json updateSettingsForSource('userSettings', { modelType: arg }) + // Set default model for the provider + setDefaultModel(arg) // Ensure settings.env gets applied to process.env applyConfigEnvironmentVariables() return { type: 'text', value: `API provider set to ${arg}.` } diff --git a/src/components/ConsoleOAuthFlow.tsx b/src/components/ConsoleOAuthFlow.tsx index 73bb98ae8..0f6acd502 100644 --- a/src/components/ConsoleOAuthFlow.tsx +++ b/src/components/ConsoleOAuthFlow.tsx @@ -13,6 +13,7 @@ import { OAuthService } from '../services/oauth/index.js' import { getOauthAccountInfo, validateForceLoginOrg } from '../utils/auth.js' import { logError } from '../utils/log.js' import { getSettings_DEPRECATED, updateSettingsForSource } from '../utils/settings/settings.js' +import { getDefaultSonnetModel } from '../utils/model/model.js' import { Select } from './CustomSelect/select.js' import { Spinner } from './Spinner.js' import TextInput from './TextInput.js' @@ -283,6 +284,8 @@ export function ConsoleOAuthFlow({ } // Reset modelType to anthropic when using OAuth login updateSettingsForSource('userSettings', { modelType: 'anthropic' } as any) + // Set default model to sonnet for Anthropic provider + updateSettingsForSource('userSettings', { model: getDefaultSonnetModel() } as any) // Clear costrict env var to prevent conflicts delete process.env.CLAUDE_CODE_USE_COSTRICT @@ -729,6 +732,8 @@ function OAuthStatusMessage({ for (const [k, v] of Object.entries(env)) process.env[k] = v // Clear costrict env var to prevent conflicts when using custom platform delete process.env.CLAUDE_CODE_USE_COSTRICT + // Set default model to sonnet for this provider + updateSettingsForSource('userSettings', { model: getDefaultSonnetModel() } as any) setOAuthStatus({ state: 'success' }) void onDone() } @@ -951,6 +956,8 @@ function OAuthStatusMessage({ for (const [k, v] of Object.entries(env)) process.env[k] = v // Clear costrict env var to prevent conflicts when using OpenAI delete process.env.CLAUDE_CODE_USE_COSTRICT + // Set default model to sonnet for this provider + updateSettingsForSource('userSettings', { model: getDefaultSonnetModel() } as any) setOAuthStatus({ state: 'success' }) void onDone() } @@ -1186,6 +1193,8 @@ function OAuthStatusMessage({ for (const [k, v] of Object.entries(env)) process.env[k] = v // Clear costrict env var to prevent conflicts when using Gemini delete process.env.CLAUDE_CODE_USE_COSTRICT + // Set default model to sonnet for this provider + updateSettingsForSource('userSettings', { model: getDefaultSonnetModel() } as any) setOAuthStatus({ state: 'success' }) void onDone() }