+
{t('model.configuration')}
-
- {availableModels.map((model) => {
- const isSelected = model.id === selectedModel?.id
- return (
-
diff --git a/desktop/src/components/layout/StatusBar.tsx b/desktop/src/components/layout/StatusBar.tsx
index e95ad7b0..82c742d1 100644
--- a/desktop/src/components/layout/StatusBar.tsx
+++ b/desktop/src/components/layout/StatusBar.tsx
@@ -1,15 +1,20 @@
import { useSettingsStore } from '../../stores/settingsStore'
import { useSessionStore } from '../../stores/sessionStore'
+import { useSessionRuntimeStore } from '../../stores/sessionRuntimeStore'
import { useTabStore } from '../../stores/tabStore'
export function StatusBar() {
const { currentModel } = useSettingsStore()
const activeTabId = useTabStore((s) => s.activeTabId)
+ const runtimeSelection = useSessionRuntimeStore((s) =>
+ activeTabId ? s.selections[activeTabId] : undefined,
+ )
const projectPath = useSessionStore((s) => s.sessions.find((session) => session.id === activeTabId)?.projectPath)
const projectName = projectPath
? projectPath.split('-').filter(Boolean).pop() || ''
: ''
+ const modelLabel = runtimeSelection?.modelId ?? currentModel?.name ?? null
return (
@@ -20,9 +25,9 @@ export function StatusBar() {
- {currentModel && (
+ {modelLabel && (
- {currentModel.name}
+ {modelLabel}
)}
diff --git a/desktop/src/constants/modelCatalog.ts b/desktop/src/constants/modelCatalog.ts
new file mode 100644
index 00000000..fbd8dbb7
--- /dev/null
+++ b/desktop/src/constants/modelCatalog.ts
@@ -0,0 +1,24 @@
+import type { ModelInfo } from '../types/settings'
+
+export const OFFICIAL_DEFAULT_MODEL_ID = 'claude-opus-4-7'
+
+export const OFFICIAL_MODELS: ModelInfo[] = [
+ {
+ id: 'claude-opus-4-7',
+ name: 'Opus 4.7',
+ description: 'Most capable for ambitious work',
+ context: '1m',
+ },
+ {
+ id: 'claude-sonnet-4-6',
+ name: 'Sonnet 4.6',
+ description: 'Most efficient for everyday tasks',
+ context: '200k',
+ },
+ {
+ id: 'claude-haiku-4-5',
+ name: 'Haiku 4.5',
+ description: 'Fastest for quick answers',
+ context: '200k',
+ },
+]
diff --git a/desktop/src/i18n/locales/en.ts b/desktop/src/i18n/locales/en.ts
index 92dbacf2..2167f6bf 100644
--- a/desktop/src/i18n/locales/en.ts
+++ b/desktop/src/i18n/locales/en.ts
@@ -81,6 +81,8 @@ export const en = {
'settings.providers.proxyFailed': '② Proxy failed: {error}',
'settings.providers.confirmDelete': 'Delete provider "{name}"? This cannot be undone.',
'settings.providers.activate': 'Activate',
+ 'settings.providers.default': 'Default',
+ 'settings.providers.setDefault': 'Set default',
'settings.providers.test': 'Test',
'settings.providers.edit': 'Edit',
'settings.providers.requestFailed': 'Request failed',
diff --git a/desktop/src/i18n/locales/zh.ts b/desktop/src/i18n/locales/zh.ts
index ff644c69..309d08e9 100644
--- a/desktop/src/i18n/locales/zh.ts
+++ b/desktop/src/i18n/locales/zh.ts
@@ -83,6 +83,8 @@ export const zh: Record
= {
'settings.providers.proxyFailed': '② 代理转换失败: {error}',
'settings.providers.confirmDelete': '删除服务商 "{name}"?此操作不可撤销。',
'settings.providers.activate': '激活',
+ 'settings.providers.default': '默认',
+ 'settings.providers.setDefault': '设为默认',
'settings.providers.test': '测试',
'settings.providers.edit': '编辑',
'settings.providers.requestFailed': '请求失败',
diff --git a/desktop/src/pages/EmptySession.tsx b/desktop/src/pages/EmptySession.tsx
index 47658d8b..a8bf7eac 100644
--- a/desktop/src/pages/EmptySession.tsx
+++ b/desktop/src/pages/EmptySession.tsx
@@ -3,8 +3,12 @@ import { skillsApi } from '../api/skills'
import { useTranslation } from '../i18n'
import { useSessionStore } from '../stores/sessionStore'
import { useChatStore } from '../stores/chatStore'
+import { useProviderStore } from '../stores/providerStore'
+import { useSessionRuntimeStore, DRAFT_RUNTIME_SELECTION_KEY } from '../stores/sessionRuntimeStore'
+import { useSettingsStore } from '../stores/settingsStore'
import { useUIStore } from '../stores/uiStore'
import { SETTINGS_TAB_ID, useTabStore } from '../stores/tabStore'
+import { OFFICIAL_DEFAULT_MODEL_ID } from '../constants/modelCatalog'
import { DirectoryPicker } from '../components/shared/DirectoryPicker'
import { PermissionModeSelector } from '../components/controls/PermissionModeSelector'
import { ModelSelector } from '../components/controls/ModelSelector'
@@ -54,6 +58,7 @@ export function EmptySession() {
const slashItemRefs = useRef<(HTMLButtonElement | null)[]>([])
const createSession = useSessionStore((state) => state.createSession)
const sendMessage = useChatStore((state) => state.sendMessage)
+ const setSessionRuntime = useChatStore((state) => state.setSessionRuntime)
const connectToSession = useChatStore((state) => state.connectToSession)
const setActiveView = useUIStore((state) => state.setActiveView)
const addToast = useUIStore((state) => state.addToast)
@@ -201,10 +206,34 @@ export function EmptySession() {
setIsSubmitting(true)
try {
+ const settings = useSettingsStore.getState()
+ let providerState = useProviderStore.getState()
+ if (
+ settings.activeProviderName &&
+ providerState.providers.length === 0 &&
+ !providerState.isLoading
+ ) {
+ await providerState.fetchProviders()
+ providerState = useProviderStore.getState()
+ }
+ const inferredProviderId = providerState.activeId ?? (
+ settings.activeProviderName
+ ? providerState.providers.find((provider) => provider.name === settings.activeProviderName)?.id ?? null
+ : null
+ )
+ const draftSelection =
+ useSessionRuntimeStore.getState().selections[DRAFT_RUNTIME_SELECTION_KEY]
+ ?? {
+ providerId: inferredProviderId,
+ modelId: settings.currentModel?.id ?? OFFICIAL_DEFAULT_MODEL_ID,
+ }
const sessionId = await createSession(workDir || undefined)
setActiveView('code')
useTabStore.getState().openTab(sessionId, 'New Session')
connectToSession(sessionId)
+ useSessionRuntimeStore.getState().setSelection(sessionId, draftSelection)
+ useSessionRuntimeStore.getState().clearSelection(DRAFT_RUNTIME_SELECTION_KEY)
+ setSessionRuntime(sessionId, draftSelection)
const attachmentPayload: AttachmentRef[] = attachments.map((attachment) => ({
type: attachment.type,
name: attachment.name,
@@ -557,7 +586,7 @@ export function EmptySession() {
@@ -248,7 +248,7 @@ function ProviderSettings() {
)}
{isActive && (
-