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:
Hermes Agentandstarship-s committed 2026-05-21 22:59:48 +00:00
1 parent cc36711b9f
commit 80356c3a47
3 files changed
+55 -8

No files matched your search

+17 -6
View File
@@ -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
View File
@@ -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]