fix: use credential_pool for custom endpoint model listing probes

Same-provider /model switches on a 'custom' endpoint kept stale credentials
because (a) _resolve_named_custom_runtime's bare-custom + explicit_base_url
path went straight to OPENAI_API_KEY/OPENROUTER_API_KEY env fallbacks
without consulting the credential pool, and (b) switch_model() guarded
against custom-provider re-resolution to preserve base_url, locking in
the prior api_key.

Now the bare-custom path queries the credential pool first (mirroring
the named-custom-provider branch behavior), and the same-provider switch
guard is removed since resolve_runtime_provider has since grown a robust
custom-resolution path that preserves base_url from model_cfg.

Refs #18681 (the gateway-side api_key wiring is still separate),
#16254, #12919.
This commit is contained in:
v1b3coder 2026-05-09 14:49:22 -07:00 committed by Teknium
parent f93b8c28e3
commit 4fdaf0b4d8
2 changed files with 10 additions and 4 deletions

View file

@ -889,10 +889,9 @@ def switch_model(
# "ollama-launch" that resolve_runtime_provider doesn't know), keep existing # "ollama-launch" that resolve_runtime_provider doesn't know), keep existing
# credentials. Otherwise use the resolved values (picks up credential rotation, # credentials. Otherwise use the resolved values (picks up credential rotation,
# base_url adjustments for OpenCode, etc.). # base_url adjustments for OpenCode, etc.).
if runtime.get("provider") != "custom": api_key = runtime.get("api_key", "")
api_key = runtime.get("api_key", "") base_url = runtime.get("base_url", "")
base_url = runtime.get("base_url", "") api_mode = runtime.get("api_mode", "")
api_mode = runtime.get("api_mode", "")
except Exception: except Exception:
pass pass

View file

@ -492,6 +492,13 @@ def _resolve_named_custom_runtime(
requested_norm = (requested_provider or "").strip().lower() requested_norm = (requested_provider or "").strip().lower()
if requested_norm == "custom" and explicit_base_url: if requested_norm == "custom" and explicit_base_url:
base_url = explicit_base_url.strip().rstrip("/") base_url = explicit_base_url.strip().rstrip("/")
# Check credential pool first — mirrors the named-custom-provider path
# so bare `provider: custom` with a configured custom_providers entry
# also gets its api_key from the pool instead of env var fallbacks.
pool_result = _try_resolve_from_custom_pool(base_url, "custom", None)
if pool_result:
pool_result["source"] = "direct-alias"
return pool_result
api_key_candidates = [ api_key_candidates = [
(explicit_api_key or "").strip(), (explicit_api_key or "").strip(),
os.getenv("OPENAI_API_KEY", "").strip(), os.getenv("OPENAI_API_KEY", "").strip(),