`hermes config set model.provider X` re-points the `model:` block at a new provider but left `model.base_url` / `model.api_mode` from the previous route in place. The runtime honours a persisted api_mode/base_url for whatever provider the block names, so X's key was posted to the old endpoint (e.g. https://chatgpt.com/backend-api/codex + codex_responses) and every request 401'd with `api_key_not_supported` blaming X. Reshapes the salvaged clearing from #40869 (which popped base_url on every provider write) into route-aware syncing, mirroring what a persisted `/model` switch writes (`model_selection_config_updates`): - `hermes_cli/route_identity.py::provider_owns_route` decides whose endpoint a base_url is: the target's registry/plugin host, a `providers:` / `custom_providers:` entry resolving to the target, or bare custom/local aliases (configured BY base_url) -> owned; another known provider's host or a named entry with a different endpoint -> foreign; unknown host -> None. - `drop_stale_model_route` pops base_url + api_mode when foreign (api_mode alone, with no base_url, is old-route wire state and goes too); keeps an owned route with its api_mode; keeps an unknown host. - `set_config_value` runs it only when model.provider actually changes, prints what was cleared and why, or warns that an unrecognised base_url still applies (the warn-only shape of #113725). - Same provider re-set, `model.default`, a target that owns the URL (openai-codex + chatgpt.com), a custom entry with that URL, and bare `custom` are untouched. Tests trimmed to two invariants (clear matrix / keep matrix) in tests/hermes_cli/test_set_config_value.py; docs in cli-commands.md. Co-authored-by: Yagna Vudathu <yagnavudathu@gmail.com> Co-authored-by: Tim Richardson <tim@growthpath.com.au>
3 lines
36 B
Plaintext
3 lines
36 B
Plaintext
timrichardson
|
|
# PR #47533 co-author
|