diff --git a/CHANGELOG.md b/CHANGELOG.md index e4c6e598..fa8707a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Hermes Web UI -- Changelog +## [v0.50.281] — 2026-05-03 + +### Fixed (1 PR by external contributor — closes #1527, #1530) + +- **LM Studio LAN-IP / Tailscale / reverse-proxy classification + new-session provider default** (#1536, @dutchaiagency; closes #1527 #1530) — when LM Studio (or any local OpenAI-compatible endpoint) is configured at a non-canonical hostname like `http://192.168.1.22:1234/v1` (LAN IP), `http://my-mac.tailnet.example:1234/v1` (Tailscale), or `https://lm.internal.example.com/v1` (reverse proxy), the WebUI's model-discovery hostname-substring guess (`"lmstudio" in host or "lm-studio" in host`) failed every time → discovered models landed in the "Custom" provider group → the active LM Studio dropdown was empty → the WebUI offered no models. Downstream: when the operator picked a model anyway, the new session's `provider`/`base_url` defaulted to OpenRouter (the fallback for unknown classifications), so every API call went to OpenRouter instead of the configured local server and failed. **Fix:** two new helpers in `api/config.py` (`_normalize_base_url_for_match` and `_configured_provider_for_base_url`) trust the user's config block — `model.base_url`, `providers..base_url`, then `custom_providers[].base_url` — before falling back to hostname guesses. The hostname-substring branch is now gated behind `not provider_from_config` so config wins. Auto-detected models are also bucketed by provider id (`auto_detected_models_by_provider`) so a configured LM Studio entry's discovered models land in the LM Studio group, not the generic Custom group. v0.50.277's deepcopy contract preserved at every consumer site (verified by Opus advisor — shared-reference source dicts cloned before any group iterates them, so dedup mutation never bleeds across groups). 5 new regression tests cover LAN IP / Tailscale / reverse-proxy LM Studio configs, custom-on-localhost (must not be reclassified as ollama), and the #1530 round-trip via `resolve_model_provider`. Cross-tool safe: agent CLI reads `model.base_url` directly from config.yaml — this PR only changes how WebUI *classifies* the configured base_url for the model picker. **First contribution by @dutchaiagency** — onboarded as a regular contributor in this PR thread; future contributions will focus on provider/config routing, onboarding, model picker behavior, cache/test hardening. + ## [v0.50.280] — 2026-05-03 ### Added (1 PR — Frank Song — cross-channel messaging handoff) diff --git a/ROADMAP.md b/ROADMAP.md index bcaa134a..663c270c 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -3,7 +3,7 @@ > Goal: Full 1:1 parity with the Hermes CLI experience via a clean dark web UI. > Everything you can do from the CLI terminal, you can do from this UI. > -> Last updated: v0.50.280 (May 03, 2026) — 3985 tests collected +> Last updated: v0.50.281 (May 03, 2026) — 3990 tests collected > Tests: `pytest tests/ --collect-only -q` > Source: / diff --git a/TESTING.md b/TESTING.md index 9ac26aef..1e9fb5df 100644 --- a/TESTING.md +++ b/TESTING.md @@ -1835,8 +1835,8 @@ Bridged CLI sessions: --- -*Last updated: v0.50.280, May 03, 2026* -*Total automated tests collected: 3985* +*Last updated: v0.50.281, May 03, 2026* +*Total automated tests collected: 3990* *Regression gate: tests/test_regressions.py* *Run: pytest tests/ -v --timeout=60* *Source: /*