= {
'settings.general.thinkingDescription': '控制新会话是否启用模型思考。关闭后,DeepSeek 等兼容供应商会收到显式非思考模式参数。',
'settings.general.thinkingEnabled': '启用思考模式',
'settings.general.thinkingHint': '关闭后会以 --thinking disabled 启动新会话;适合 DeepSeek V4 Flash/Pro 等需要非思考模式的模型。',
+ 'settings.general.thinkingAutoCollapse': '自动折叠思考内容',
'settings.general.notificationsTitle': '系统通知',
'settings.general.notificationsDescription': '使用操作系统原生通知提醒授权确认、Agent 回复完成和定时任务结果。',
'settings.general.notificationsEnabled': '启用系统通知',
diff --git a/desktop/src/pages/Settings.tsx b/desktop/src/pages/Settings.tsx
index a1904bf7..ec15292d 100644
--- a/desktop/src/pages/Settings.tsx
+++ b/desktop/src/pages/Settings.tsx
@@ -1811,6 +1811,8 @@ export function GeneralSettings() {
const {
thinkingEnabled,
setThinkingEnabled,
+ thinkingAutoCollapse,
+ setThinkingAutoCollapse,
locale,
setLocale,
theme,
@@ -2466,6 +2468,21 @@ export function GeneralSettings() {
+
diff --git a/desktop/src/stores/settingsStore.ts b/desktop/src/stores/settingsStore.ts
index 30b97603..670c710a 100644
--- a/desktop/src/stores/settingsStore.ts
+++ b/desktop/src/stores/settingsStore.ts
@@ -60,6 +60,7 @@ type SettingsStore = {
currentModel: ModelInfo | null
effortLevel: EffortLevel
thinkingEnabled: boolean
+ thinkingAutoCollapse: boolean
availableModels: ModelInfo[]
activeProviderName: string | null
locale: Locale
@@ -95,6 +96,7 @@ type SettingsStore = {
setModel: (modelId: string) => Promise
setEffort: (level: EffortLevel) => Promise
setThinkingEnabled: (enabled: boolean) => Promise
+ setThinkingAutoCollapse: (enabled: boolean) => Promise
setLocale: (locale: Locale) => void
setTheme: (theme: ThemeMode) => Promise
setChatSendBehavior: (behavior: ChatSendBehavior) => Promise
@@ -169,6 +171,7 @@ export const useSettingsStore = create((set, get) => ({
currentModel: null,
effortLevel: 'max',
thinkingEnabled: true,
+ thinkingAutoCollapse: true,
availableModels: [],
activeProviderName: null,
locale: getStoredLocale(),
@@ -237,6 +240,7 @@ export const useSettingsStore = create((set, get) => ({
currentModel: model,
effortLevel: level,
thinkingEnabled: userSettings.alwaysThinkingEnabled !== false,
+ thinkingAutoCollapse: userSettings.thinkingAutoCollapse !== false,
theme,
chatSendBehavior: normalizeChatSendBehavior(userSettings.chatSendBehavior),
outputStyle: normalizeOutputStyle(userSettings.outputStyle),
@@ -307,6 +311,16 @@ export const useSettingsStore = create((set, get) => ({
}
},
+ setThinkingAutoCollapse: async (enabled) => {
+ const prev = get().thinkingAutoCollapse
+ set({ thinkingAutoCollapse: enabled })
+ try {
+ await settingsApi.updateUser({ thinkingAutoCollapse: enabled })
+ } catch {
+ set({ thinkingAutoCollapse: prev })
+ }
+ },
+
setLocale: (locale) => {
set({ locale })
try { localStorage.setItem(LOCALE_STORAGE_KEY, locale) } catch { /* noop */ }
diff --git a/desktop/src/theme/globals.css b/desktop/src/theme/globals.css
index 0b895c9a..45dff515 100644
--- a/desktop/src/theme/globals.css
+++ b/desktop/src/theme/globals.css
@@ -1256,6 +1256,15 @@ button, input, textarea, select, a, [role="button"] {
animation: fade-in 200ms ease-out;
}
+/* Thinking brain icon pulse animation */
+@keyframes thinking-brain-pulse {
+ 0%, 100% { transform: scale(1); opacity: 0.85; }
+ 50% { transform: scale(1.08); opacity: 1; }
+}
+.thinking-brain-icon {
+ animation: thinking-brain-pulse 1.8s ease-in-out infinite;
+}
+
/* Thinking block animations */
@keyframes thinking-cursor-blink {
0%, 100% { opacity: 1; }