diff --git a/backend/apps/settings/models.py b/backend/apps/settings/models.py index ddf00328..83eb3485 100644 --- a/backend/apps/settings/models.py +++ b/backend/apps/settings/models.py @@ -70,7 +70,7 @@ DEFAULT_SYSTEM_PROMPT = ( # Fresh-install / unset-fallback model. "opus-5" is the plain row: cc/ sub lane for subscription users, API key otherwise. -DEFAULT_MODEL = "opus-5" +DEFAULT_MODEL = "sonnet-5" class AppSettings(BaseModel): diff --git a/backend/tests/test_settings_migration.py b/backend/tests/test_settings_migration.py index b16dce49..f64c5f71 100644 --- a/backend/tests/test_settings_migration.py +++ b/backend/tests/test_settings_migration.py @@ -63,7 +63,7 @@ def test_minimal_old_file_fills_missing_with_defaults(settings_file): p_write(settings_file, {"theme": "light"}) s = store.load_settings() assert s.theme == "light" - assert s.default_model == "opus-5" # filled from default + assert s.default_model == "sonnet-5" # filled from default assert s.auto_reveal_sub_agents is True diff --git a/frontend/src/app/Main.tsx b/frontend/src/app/Main.tsx index ef3dd910..218e12d9 100644 --- a/frontend/src/app/Main.tsx +++ b/frontend/src/app/Main.tsx @@ -322,8 +322,8 @@ const DEFAULT_MODEL_PRIORITY: string[] = [ ]; const DEFAULT_MODEL_PICKS: Record = { - Anthropic: ['opus-5-cc', 'opus-5', 'opus-5-api', 'sonnet-5-cc', 'sonnet-5'], - OpenAI: ['gpt-5.6', 'gpt-5.6-api', 'gpt-5.5', 'gpt-5.5-api'], + Anthropic: ['sonnet-5-cc', 'sonnet-5', 'sonnet-5-api', 'opus-5-cc', 'opus-5'], + OpenAI: ['gpt-5.6-terra', 'gpt-5.6', 'gpt-5.6-api', 'gpt-5.5', 'gpt-5.5-api'], Google: ['gemini-3.6-flash-api', 'gemini-3.5-flash-api', 'gemini-3.1-flash-lite'], 'OpenSwarm Pro': ['sonnet', 'opus'], OpenSwarm: ['gpt-5-mini', 'claude-haiku-4.5', 'gpt-4.1'], diff --git a/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx b/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx index 24a3757b..2598a3a3 100644 --- a/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx +++ b/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx @@ -87,14 +87,14 @@ const DashboardToolbar = React.forwardRef( const defaultThinkingLevel = useAppSelector((s) => s.settings.data.default_thinking_level); const settingsLoaded = useAppSelector((s) => s.settings.loaded); const [mode, setMode] = useState(defaultMode || 'agent'); - const [model, setModel] = useState(defaultModel || 'opus-5'); + const [model, setModel] = useState(defaultModel || 'sonnet-5'); const [thinkingLevel, setThinkingLevel] = useState<'off' | 'low' | 'medium' | 'high' | 'auto'>(defaultThinkingLevel || 'auto'); // Snap to the persisted Settings defaults as soon as they arrive from the backend. Without the settingsLoaded guard, the effect fires against the Redux initialState ('sonnet') before the real default has loaded, and the settingsApplied flag then locks out the real default for the rest of the session, so new chats spawn under the stale value. const settingsApplied = useRef(false); useEffect(() => { if (settingsLoaded && !settingsApplied.current) { setMode(defaultMode || 'agent'); - setModel(defaultModel || 'opus-5'); + setModel(defaultModel || 'sonnet-5'); setThinkingLevel(defaultThinkingLevel || 'auto'); settingsApplied.current = true; } @@ -129,7 +129,7 @@ const DashboardToolbar = React.forwardRef( useEffect(() => { if (settingsLoaded && inputOpen && !prevInputOpen.current) { setMode(defaultMode || 'agent'); - setModel(defaultModel || 'opus-5'); + setModel(defaultModel || 'sonnet-5'); setThinkingLevel(defaultThinkingLevel || 'auto'); } prevInputOpen.current = inputOpen; diff --git a/frontend/src/shared/state/settingsSlice.ts b/frontend/src/shared/state/settingsSlice.ts index bf2ca6fb..e6a61e55 100644 --- a/frontend/src/shared/state/settingsSlice.ts +++ b/frontend/src/shared/state/settingsSlice.ts @@ -163,7 +163,7 @@ interface SettingsState { export const DEFAULT_SETTINGS: AppSettings = { default_system_prompt: null, default_folder: null, - default_model: 'opus-5', + default_model: 'sonnet-5', default_mode: 'agent', default_max_turns: null, default_thinking_level: 'auto',