398634eeda
Same bug family as #47828, at the config-persistence layer instead of the in-memory agent layer: - cli.py (#25106): the --global /model handlers (both the typed-name path in _handle_model_switch and the picker path in _apply_model_switch_result) wrote model.default/model.provider to config.yaml but never touched base_url/api_mode at all. A provider switch left the OLD endpoint on disk; the next launch reconnected to the previous provider's host under the new model name. - gateway/slash_commands.py (#25107): both persist-global blocks (the picker-tap callback and the typed /model --global path) guarded the write with two INDEPENDENT ifs — `if result.base_url: ...` and `if target_provider != "custom": clear_model_endpoint_credentials(...)`. For named providers the second if always cleared stale values, masking the bug. For a custom provider with an empty resolved base_url, neither branch fired, so the previous custom endpoint's base_url/api_key/ api_mode survived untouched in config.yaml. Fix: explicit set-if-truthy/clear-if-falsy for base_url and api_mode at all four call sites, matching the already-correct pattern in tui_gateway/server.py:_persist_model_switch (fixed for #48305). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>