From 1473fc7336ba4620e15199e4b8928223fa6662d8 Mon Sep 17 00:00:00 2001 From: 0xallam Date: Sun, 7 Jun 2026 22:58:48 +0300 Subject: [PATCH] Use validate_environment to resolve provider env var Naively uppercasing the routing prefix breaks for providers whose LiteLLM env var name doesn't match the prefix verbatim: together_ai/... needs TOGETHERAI_API_KEY (no underscore) perplexity/... needs PERPLEXITYAI_API_KEY Ask LiteLLM directly via litellm.validate_environment(model=...) which env vars it consults for the chosen provider, then setdefault each one to LLM_API_KEY. This is the SDK-blessed lookup and stays correct for every provider LiteLLM supports without a hand-maintained name map. Lowercase the routed model name before lookup so mixed-case user input (e.g. Together_AI/...) still resolves. --- strix/config/models.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/strix/config/models.py b/strix/config/models.py index 9cf14cb..59a52a4 100644 --- a/strix/config/models.py +++ b/strix/config/models.py @@ -61,17 +61,20 @@ def configure_sdk_model_defaults(settings: Settings) -> None: def _mirror_api_key_to_provider_env(model_name: str | None, api_key: str) -> None: if not model_name: return + import litellm + name = normalize_model_name(model_name) for prefix in ("litellm/", "any-llm/"): if name.lower().startswith(prefix): name = name[len(prefix) :] break - if "/" not in name: + try: + report = litellm.validate_environment(model=name.lower()) + except Exception: # noqa: BLE001 return - provider = name.split("/", 1)[0].strip().upper() - if not provider: - return - os.environ.setdefault(f"{provider}_API_KEY", api_key) + for env_key in report.get("missing_keys") or []: + if env_key.endswith("_API_KEY"): + os.environ.setdefault(env_key, api_key) def _configure_litellm_compatibility() -> None: