mirror of
https://github.com/nesquena/hermes-webui.git
synced 2026-05-25 11:10:18 +00:00
66b925f59d
Closes #1633. STATE_DIR/models_cache.json was persisted across server restarts without any version stamp, so a Docker container update from version A to B read the cache file written by version A — users saw stale picker contents (missing models, phantom provider groups) for up to 24 hours until either the TTL expired, an unrelated provider edit triggered invalidate_models_cache(), or they manually deleted the file. Reporter Deor (Discord) updated to v0.50.292 — which contained fixes for #1538, #1539, and #1568 — did a hard refresh and cleared site data, and still saw byte-for-byte identical picker contents because the server kept reading the v0.50.281 cache file off the host-mounted state volume. Fix: * _save_models_cache_to_disk() stamps payloads with _webui_version (resolved lazily from api.updates.WEBUI_VERSION via sys.modules lookup to avoid the api.config <-> api.updates circular import) and _schema_version = 2. * New _is_loadable_disk_cache() validator checks both stamps in addition to shape. Mismatch on either field rejects the load. * _load_models_cache_from_disk() calls the new validator and strips the disk-only metadata before returning, so the rest of the code sees the same shape it always did. * _is_valid_models_cache() kept loose (shape-only) so in-memory cache writes that never touch disk don't fail validation. Schema version is independent of the WebUI version stamp so future cache-shape changes can invalidate older releases without relying on a tag bump alone. Early-init edge case (api.updates not yet loaded) skips the version check rather than wedging the boot — at worst an unstamped file is written once and rejected on the next call. Updated existing tests/test_model_cache_metadata.py to use subset/ round-trip semantics rather than byte-for-byte equality, since the disk payload now has additional stamps. The four response-shape fields still round-trip verbatim; the load result is unchanged (stamps stripped). 19 new regression tests. 4180 -> 4199 tests pass.