Stage 400: PR #2709 — fix(model): prefer profile default model on fresh boot when localStorage has no persisted pick
Co-authored-by: starship-s <starship-s@users.noreply.github.com>
This commit is contained in:
1 parent
cc36711b9f
commit
80356c3a47
3 files changed
+55
-8
No files matched your search
+17
-6
@@ -1459,10 +1459,15 @@ function applyBotName(){
|
||||
if(s.default_model){
|
||||
window._defaultModel=s.default_model;
|
||||
const sel=$('modelSelect');
|
||||
const savedState=(typeof _readPersistedModelState==='function')
|
||||
? _readPersistedModelState()
|
||||
: (localStorage.getItem('hermes-webui-model')?{model:localStorage.getItem('hermes-webui-model'),model_provider:null}:null);
|
||||
if(sel&&!savedState&&typeof _applyModelToDropdown==='function'){
|
||||
if(sel&&typeof _applyModelToDropdown==='function'){
|
||||
// Fresh page boot must prefer the profile/server default over stale
|
||||
// browser-persisted model state. A restored session can still apply its
|
||||
// own persisted model later through loadSession().
|
||||
if(typeof _clearPersistedModelState==='function') _clearPersistedModelState();
|
||||
else {
|
||||
localStorage.removeItem('hermes-webui-model');
|
||||
localStorage.removeItem('hermes-webui-model-state');
|
||||
}
|
||||
const existingDefaultOpt=Array.from(sel.options).find(o=>o.value===s.default_model);
|
||||
if(existingDefaultOpt&&window._activeProvider&&!existingDefaultOpt.dataset.provider){
|
||||
existingDefaultOpt.dataset.provider=window._activeProvider;
|
||||
@@ -1575,7 +1580,10 @@ function applyBotName(){
|
||||
? _readPersistedModelState()
|
||||
: (localStorage.getItem('hermes-webui-model')?{model:localStorage.getItem('hermes-webui-model'),model_provider:null}:null);
|
||||
const savedModel=savedState&&savedState.model;
|
||||
if(savedModel && $('modelSelect')){
|
||||
// Guardrail: prefer profile/server default on boot when available.
|
||||
// Persisted browser model state should not override a valid default model.
|
||||
const allowBootSavedModelOverride=!window._defaultModel;
|
||||
if(savedModel && $('modelSelect') && allowBootSavedModelOverride){
|
||||
const applied=(typeof _applyModelToDropdown==='function')
|
||||
? _applyModelToDropdown(savedModel,$('modelSelect'),savedState.model_provider||null)
|
||||
: null;
|
||||
@@ -1583,7 +1591,10 @@ function applyBotName(){
|
||||
// If the value didn't take (model not in list), clear the bad pref
|
||||
if(!applied&&$('modelSelect').value!==savedModel){
|
||||
if(typeof _clearPersistedModelState==='function') _clearPersistedModelState();
|
||||
else localStorage.removeItem('hermes-webui-model');
|
||||
else {
|
||||
localStorage.removeItem('hermes-webui-model');
|
||||
localStorage.removeItem('hermes-webui-model-state');
|
||||
}
|
||||
}
|
||||
else if(typeof syncModelChip==='function') syncModelChip();
|
||||
}
|
||||
|
||||
+4
-2
@@ -992,8 +992,10 @@ async function populateModelDropdown(){
|
||||
}
|
||||
sel.appendChild(og);
|
||||
}
|
||||
// Set default model from server if no localStorage preference
|
||||
if(data.default_model && !(typeof _readPersistedModelState==='function'&&_readPersistedModelState()) && !localStorage.getItem('hermes-webui-model')){
|
||||
// Set default model from server on fresh/blank boot. Loaded sessions keep
|
||||
// their own persisted model and apply it via loadSession(). Do not let stale
|
||||
// browser localStorage suppress the profile default.
|
||||
if(data.default_model && !(S.session&&S.session.model)){
|
||||
_applyModelToDropdown(data.default_model, sel, data.active_provider||null);
|
||||
}
|
||||
if(typeof syncModelChip==='function') syncModelChip();
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
"""
|
||||
Regression coverage for model selector drift on fresh browser boot.
|
||||
|
||||
A stale browser-persisted model (localStorage) must not suppress the configured
|
||||
profile/server default on page load. Restored sessions may still apply their own
|
||||
session model later through loadSession().
|
||||
"""
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
REPO = Path(__file__).resolve().parents[1]
|
||||
BOOT_JS = (REPO / "static" / "boot.js").read_text(encoding="utf-8")
|
||||
UI_JS = (REPO / "static" / "ui.js").read_text(encoding="utf-8")
|
||||
|
||||
|
||||
def test_boot_settings_applies_default_even_when_browser_model_state_exists():
|
||||
assert "Fresh page boot must prefer the profile/server default" in BOOT_JS
|
||||
assert "_clearPersistedModelState" in BOOT_JS
|
||||
assert "localStorage.removeItem('hermes-webui-model-state')" in BOOT_JS
|
||||
assert "if(sel&&typeof _applyModelToDropdown==='function')" in BOOT_JS
|
||||
assert "if(sel&&!savedState&&typeof _applyModelToDropdown==='function')" not in BOOT_JS
|
||||
|
||||
|
||||
def test_populate_model_dropdown_default_not_blocked_by_localstorage():
|
||||
assert "Do not let stale\n // browser localStorage suppress the profile default" in UI_JS
|
||||
assert "if(data.default_model && !(S.session&&S.session.model))" in UI_JS
|
||||
assert "_readPersistedModelState()" not in _populate_default_guard_snippet()
|
||||
assert "localStorage.getItem('hermes-webui-model')" not in _populate_default_guard_snippet()
|
||||
|
||||
|
||||
def _populate_default_guard_snippet() -> str:
|
||||
marker = "// Set default model from server on fresh/blank boot."
|
||||
start = UI_JS.index(marker)
|
||||
return UI_JS[start : start + 500]
|
||||
Reference in new issue
Block a user