Skip to content

Commit 7a26c90

Browse files
Wing900claude
andcommitted
refactor: 移除 defaultModel,统一使用 lastSelectedModel
- 删除 settings.defaultModel 字段 - 新建聊天时优先级:角色模型 > lastSelectedModel > 模型列表第一个 - 用户切换模型时只更新 lastSelectedModel - 简化模型选择逻辑,减少混乱 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 71b00e1 commit 7a26c90

File tree

10 files changed

+241
-176
lines changed

10 files changed

+241
-176
lines changed

components/app/AppContainer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export const AppContainer: React.FC = () => {
198198
onRegenerate={handleRegenerate}
199199
onEditAndResubmit={handleEditAndResubmit}
200200
onEditMessage={uiState.setEditingMessage}
201-
onSetCurrentModel={(model) => handleSettingsChange({ defaultModel: model })}
201+
onSetCurrentModel={(model) => handleSettingsChange({ lastSelectedModel: model })}
202202
onSetModelForActiveChat={chatDataHandlers.handleSetModelForActiveChat}
203203
isSidebarCollapsed={sidebarState.isCollapsed}
204204
onToggleSidebar={handleToggleSidebar}

components/app/AppContent.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ export const AppContent: React.FC<AppContentProps> = ({
122122
onEditMessage,
123123
}}
124124
modelConfig={{
125-
currentModel: settings.defaultModel,
125+
currentModel: settings.lastSelectedModel ?? availableModels[0] ?? '',
126126
availableModels,
127127
onSetCurrentModel,
128128
onSetModelForActiveChat,

components/persona/AIBuilder.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export const AIBuilder: React.FC<AIBuilderProps> = ({ persona, onUpdate, setting
4343
const apiKeys = settings.apiKey?.length ? settings.apiKey : (process.env.API_KEY ? [process.env.API_KEY] : []);
4444
if (apiKeys.length === 0) throw new Error("API Key not set.");
4545

46-
const { personaUpdate, explanation } = await generatePersonaUpdate(apiKeys, settings.defaultModel, persona, userInput, settings);
46+
const { personaUpdate, explanation } = await generatePersonaUpdate(apiKeys, settings.lastSelectedModel ?? availableModels[0] ?? '', persona, userInput, settings);
4747

4848
onUpdate(personaUpdate);
4949
setMessages(prev => prev.map(m => m.id === statusMessageId ? { ...m, role: 'model', content: explanation } : m));

components/persona/PersonaEditor.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export const PersonaEditor: React.FC<PersonaEditorProps> = ({ personaToEdit, onS
111111
<label className="font-medium">{t('model')}</label>
112112
<CustomSelect
113113
options={availableModels.map(m => ({ value: m, label: formatModelName(m) }))}
114-
value={persona.model ?? settings.defaultModel}
114+
value={persona.model ?? settings.lastSelectedModel ?? availableModels[0] ?? ''}
115115
onChange={value => handleUpdate({ model: value })}
116116
className="w-48"
117117
/>

hooks/useAppData.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ export const useAppData = (
110110
setChats,
111111
setActiveChatId,
112112
addToast: toast,
113+
availableModels,
113114
});
114115

115116
// 处理新聊天创建
@@ -124,9 +125,9 @@ export const useAppData = (
124125
const persona = selectedPersonaId ? personas.find((p) => p && p.id === selectedPersonaId) : null;
125126

126127
if (persona) {
127-
// 优先级:用户最后选择的模型 > 角色默认模型 > 系统默认模型
128-
const modelToUse = settings.lastSelectedModel ?? persona.model ?? settings.defaultModel;
129-
128+
// 优先级:角色默认模型 > 用户最后选择的模型 > 模型列表第一个
129+
const modelToUse = persona.model ?? settings.lastSelectedModel ?? availableModels[0] ?? '';
130+
130131
const newChatSession: ChatSession = {
131132
id: crypto.randomUUID(),
132133
title: persona.name || 'New Persona Chat',
@@ -149,7 +150,8 @@ export const useAppData = (
149150
},
150151
[
151152
settings.defaultPersona,
152-
settings.defaultModel,
153+
settings.lastSelectedModel,
154+
availableModels,
153155
personas,
154156
setChats,
155157
setActiveChatId,

hooks/useChatData.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export const useChatData = ({ settings, isStorageLoaded, onSettingsChange }: Use
100100
setChats(p => p.map(c => c.id === activeChatId ? { ...c, model } : c));
101101
}
102102
// 保存用户最后选择的模型,用于新建聊天时的记忆功能
103-
onSettingsChange({ defaultModel: model, lastSelectedModel: model });
103+
onSettingsChange({ lastSelectedModel: model });
104104
}, [activeChatId, onSettingsChange]);
105105

106106
// This function is now handled by a callback passed from App.tsx to ChatView

hooks/useChatMessaging.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ interface UseChatMessagingProps {
1414
activeChat: ChatSession | null;
1515
personas: Persona[];
1616
setChats: React.Dispatch<React.SetStateAction<ChatSession[]>>;
17-
1817
setActiveChatId: React.Dispatch<React.SetStateAction<string | null>>;
1918
addToast: (message: string, type: 'success' | 'error' | 'info') => void;
19+
availableModels: string[];
2020
}
2121

22-
export const useChatMessaging = ({ settings, activeChat, personas, setChats, setActiveChatId, addToast }: UseChatMessagingProps) => {
22+
export const useChatMessaging = ({ settings, activeChat, personas, setChats, setActiveChatId, addToast, availableModels }: UseChatMessagingProps) => {
2323
const [isLoading, setIsLoading] = useState(false);
2424
const isCancelledRef = useRef(false);
2525
let inactivityTimer: NodeJS.Timeout; // For stream watchdog
@@ -29,7 +29,7 @@ export const useChatMessaging = ({ settings, activeChat, personas, setChats, set
2929
setIsLoading(false);
3030
}, []);
3131

32-
const _initiateStream = useCallback(async (chatId: string, historyForAPI: Message[], personaId: string | null | undefined, titleGenerationMode: 'INITIAL' | 'RECURRING' | null = null) => {
32+
const _initiateStream = useCallback(async (chatId: string, historyForAPI: Message[], personaId: string | null | undefined, titleGenerationMode: 'INITIAL' | 'RECURRING' | null = null, availableModels: string[] = []) => {
3333
// 获取 API Key:如果用户启用了自定义,使用用户的配置;否则使用环境变量
3434
let apiKeys: string[] = [];
3535
if (settings.useCustomApi) {
@@ -53,9 +53,12 @@ export const useChatMessaging = ({ settings, activeChat, personas, setChats, set
5353
isCancelledRef.current = false;
5454
setIsLoading(true);
5555

56-
const chatSession = activeChat && activeChat.id === chatId
57-
? activeChat
58-
: { id: chatId, messages: historyForAPI, model: settings.defaultModel, personaId, title: "New Chat", createdAt: Date.now(), folderId: null };
56+
// 确定使用的模型:优先使用 lastSelectedModel,否则使用模型列表第一个
57+
const defaultModel = settings.lastSelectedModel ?? availableModels[0] ?? '';
58+
59+
const chatSession = activeChat && activeChat.id === chatId
60+
? activeChat
61+
: { id: chatId, messages: historyForAPI, model: defaultModel, personaId, title: "New Chat", createdAt: Date.now(), folderId: null };
5962

6063
const activePersona = chatSession.personaId ? personas.find(p => p && p.id === chatSession.personaId) : null;
6164

@@ -348,8 +351,8 @@ export const useChatMessaging = ({ settings, activeChat, personas, setChats, set
348351
if (!currentChatId) {
349352
currentPersonaId = settings.defaultPersona;
350353
const persona = personas.find(p => p.id === currentPersonaId);
351-
// 优先级:用户最后选择的模型 > 角色默认模型 > 系统默认模型
352-
const modelToUse = settings.lastSelectedModel ?? persona?.model ?? settings.defaultModel;
354+
// 优先级:角色默认模型 > 用户最后选择的模型 > 模型列表第一个
355+
const modelToUse = persona?.model ?? settings.lastSelectedModel ?? availableModels[0] ?? '';
353356
const newChat: ChatSession = { id: crypto.randomUUID(), title: persona?.name || content.substring(0, 40) || "New Chat", icon: (persona?.avatar?.type === 'emoji' ? persona.avatar.value : '👤') || "💬", messages: [userMessage], createdAt: Date.now(), model: modelToUse, folderId: null, personaId: currentPersonaId };
354357
currentChatId = newChat.id;
355358
history = newChat.messages;
@@ -372,8 +375,8 @@ export const useChatMessaging = ({ settings, activeChat, personas, setChats, set
372375
historyForAPI = [...history.slice(0, -1), messageWithPDF];
373376
}
374377

375-
await _initiateStream(currentChatId, historyForAPI, currentPersonaId, titleGenerationMode);
376-
}, [activeChat, settings, setChats, setActiveChatId, _initiateStream, personas]);
378+
await _initiateStream(currentChatId, historyForAPI, currentPersonaId, titleGenerationMode, availableModels);
379+
}, [activeChat, settings, setChats, setActiveChatId, _initiateStream, personas, availableModels]);
377380

378381
const handleDeleteMessage = useCallback((messageId: string) => {
379382
if (!activeChat?.id) return;
@@ -421,9 +424,9 @@ export const useChatMessaging = ({ settings, activeChat, personas, setChats, set
421424

422425
if (historyForResubmit.length > 0) {
423426
setChats(prev => prev.map(c => c.id === chatId ? { ...c, messages: historyForResubmit } : c));
424-
_initiateStream(chatId, historyForResubmit, activeChat.personaId);
427+
_initiateStream(chatId, historyForResubmit, activeChat.personaId, null, availableModels);
425428
}
426-
}, [activeChat, isLoading, setChats, _initiateStream]);
429+
}, [activeChat, isLoading, setChats, _initiateStream, availableModels]);
427430

428431
const handleEditAndResubmit = useCallback((messageId: string, newContent: string) => {
429432
if (!activeChat?.id || isLoading) return;
@@ -440,9 +443,9 @@ export const useChatMessaging = ({ settings, activeChat, personas, setChats, set
440443

441444
if (historyForResubmit.length > 0) {
442445
setChats(prev => prev.map(c => c.id === chatId ? { ...c, messages: historyForResubmit } : c));
443-
_initiateStream(chatId, historyForResubmit, activeChat.personaId);
446+
_initiateStream(chatId, historyForResubmit, activeChat.personaId, null, availableModels);
444447
}
445-
}, [activeChat, isLoading, setChats, _initiateStream]);
448+
}, [activeChat, isLoading, setChats, _initiateStream, availableModels]);
446449

447450
return {
448451
isLoading,

0 commit comments

Comments
 (0)