Skip to content

Commit 539830f

Browse files
committed
fix: select default model after async models load
1 parent e577329 commit 539830f

1 file changed

Lines changed: 57 additions & 45 deletions

File tree

src/lib/components/chat/Chat.svelte

Lines changed: 57 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,31 +1358,15 @@
13581358
// Web functions
13591359
//////////////////////////
13601360
1361-
const initNewChat = async () => {
1362-
console.log('initNewChat');
1363-
resetWebSearchConfirmation();
1364-
1365-
// Mark the outgoing chat as read before resetting; in-place created chats
1366-
// keep chatIdProp undefined, so navigateHandler never marks them read.
1367-
if ($chatId && !$temporaryChatEnabled) {
1368-
updateLastReadAt($chatId);
1369-
}
1370-
1371-
if ($user?.role !== 'admin' && $user?.permissions?.chat?.temporary_enforced) {
1372-
await temporaryChatEnabled.set(true);
1373-
}
1374-
1375-
if ($settings?.temporaryChatByDefault ?? false) {
1376-
if ($temporaryChatEnabled === false) {
1377-
await temporaryChatEnabled.set(true);
1378-
} else if ($temporaryChatEnabled === null) {
1379-
// if set to null set to false; refer to temp chat toggle click handler
1380-
await temporaryChatEnabled.set(false);
1381-
}
1361+
const applySelectedModels = async () => {
1362+
// $models loads asynchronously; resolving while empty blanks the selector and never recovers
1363+
if ($models.length === 0) {
1364+
return;
13821365
}
13831366
1384-
if ($user?.role !== 'admin' && !$user?.permissions?.chat?.temporary) {
1385-
await temporaryChatEnabled.set(false);
1367+
// keep a valid existing selection (e.g. user's manual choice)
1368+
if (selectedModels.some((modelId) => modelId && $models.some((m) => m.id === modelId))) {
1369+
return;
13861370
}
13871371
13881372
const availableModels = $models
@@ -1400,7 +1384,7 @@
14001384
14011385
if (urlModels.length === 1) {
14021386
if (!$models.find((m) => m.id === urlModels[0])) {
1403-
// Model not found; open model selector and prefill
1387+
// model not in list — open the selector prefilled with the requested id
14041388
const modelSelectorButton = document.getElementById('model-selector-0-button');
14051389
if (modelSelectorButton) {
14061390
modelSelectorButton.click();
@@ -1414,43 +1398,32 @@
14141398
}
14151399
}
14161400
} else {
1417-
// Model found; set it as selected
14181401
selectedModels = urlModels;
14191402
}
14201403
} else {
1421-
// Multiple models; set as selected
14221404
selectedModels = urlModels;
14231405
}
14241406
1425-
// Unavailable models filtering
14261407
selectedModels = selectedModels.filter((modelId) =>
14271408
$models.map((m) => m.id).includes(modelId)
14281409
);
14291410
} else {
1411+
// priority: folder → sticky session → user default → admin default
14301412
if ($selectedFolder?.data?.model_ids) {
1431-
// Set from folder model IDs
14321413
selectedModels = $selectedFolder?.data?.model_ids;
1433-
} else {
1434-
if (sessionStorage.selectedModels) {
1435-
// Set from session storage (temporary selection)
1436-
selectedModels = JSON.parse(sessionStorage.selectedModels);
1437-
sessionStorage.removeItem('selectedModels');
1438-
} else {
1439-
if ($settings?.models) {
1440-
// Set from user settings
1441-
selectedModels = $settings?.models;
1442-
} else if (defaultModels && defaultModels.length > 0) {
1443-
// Set from default models
1444-
selectedModels = defaultModels;
1445-
}
1446-
}
1414+
} else if (sessionStorage.selectedModels) {
1415+
selectedModels = JSON.parse(sessionStorage.selectedModels);
1416+
sessionStorage.removeItem('selectedModels');
1417+
} else if ($settings?.models) {
1418+
selectedModels = $settings?.models;
1419+
} else if (defaultModels && defaultModels.length > 0) {
1420+
selectedModels = defaultModels;
14471421
}
14481422
1449-
// Unavailable & hidden models filtering
14501423
selectedModels = selectedModels.filter((modelId) => availableModels.includes(modelId));
14511424
}
14521425
1453-
// Ensure at least one model is selected
1426+
// fall back to admin default, then the first available model
14541427
if (selectedModels.length === 0 || (selectedModels.length === 1 && selectedModels[0] === '')) {
14551428
if (availableModels.length > 0) {
14561429
if (defaultModels && defaultModels.length > 0) {
@@ -1461,14 +1434,53 @@
14611434
selectedModels.length === 0 ||
14621435
(selectedModels.length === 1 && selectedModels[0] === '')
14631436
) {
1464-
// Only fall back to first available model if default models didn't resolve
14651437
selectedModels = [availableModels?.at(0) ?? ''];
14661438
}
14671439
} else {
14681440
selectedModels = [''];
14691441
}
14701442
}
14711443
1444+
selectedModels = selectedModels.map((modelId) =>
1445+
$models.map((m) => m.id).includes(modelId) ? modelId : ''
1446+
);
1447+
};
1448+
1449+
// re-resolve once models load, covering the race where initNewChat() ran while $models was empty
1450+
1451+
$: if (chatIdProp === '' && $models.length > 0) {
1452+
applySelectedModels();
1453+
}
1454+
1455+
const initNewChat = async () => {
1456+
console.log('initNewChat');
1457+
resetWebSearchConfirmation();
1458+
1459+
// Mark the outgoing chat as read before resetting; in-place created chats
1460+
// keep chatIdProp undefined, so navigateHandler never marks them read.
1461+
if ($chatId && !$temporaryChatEnabled) {
1462+
updateLastReadAt($chatId);
1463+
}
1464+
1465+
if ($user?.role !== 'admin' && $user?.permissions?.chat?.temporary_enforced) {
1466+
await temporaryChatEnabled.set(true);
1467+
}
1468+
1469+
if ($settings?.temporaryChatByDefault ?? false) {
1470+
if ($temporaryChatEnabled === false) {
1471+
await temporaryChatEnabled.set(true);
1472+
} else if ($temporaryChatEnabled === null) {
1473+
// if set to null set to false; refer to temp chat toggle click handler
1474+
await temporaryChatEnabled.set(false);
1475+
}
1476+
}
1477+
1478+
if ($user?.role !== 'admin' && !$user?.permissions?.chat?.temporary) {
1479+
await temporaryChatEnabled.set(false);
1480+
}
1481+
1482+
await applySelectedModels();
1483+
14721484
if ($mobile) {
14731485
await showControls.set(false);
14741486
}

0 commit comments

Comments
 (0)