From 5ce51cf5f0670aae3bb1eff72ae05cafed3e8fa7 Mon Sep 17 00:00:00 2001 From: yyouretoast Date: Fri, 16 Oct 2026 18:39:33 +0300 Subject: [PATCH] fix(openrouter): simplify parameter extraction and resolve basedpyright diagnostics --- .../exception_mapping_utils.py | 2 +- .../llms/openrouter/chat/transformation.py | 18 ++------ litellm/llms/openrouter/data_residency.py | 15 +++---- litellm/main.py | 42 ++++--------------- 4 files changed, 22 insertions(+), 55 deletions(-) diff --git a/litellm/litellm_core_utils/exception_mapping_utils.py b/litellm/litellm_core_utils/exception_mapping_utils.py index df97956dd4e..ade5b0e4046 100644 --- a/litellm/litellm_core_utils/exception_mapping_utils.py +++ b/litellm/litellm_core_utils/exception_mapping_utils.py @@ -2240,7 +2240,7 @@ def _map_openrouter_exception( message=f"OpenRouterRegionNotSupportedError: {exception_provider} - {error_str}", model=model, llm_provider=custom_llm_provider, - response=response_obj if isinstance(response_obj, httpx.Response) else None, + response=getattr(original_exception, "response", None), litellm_debug_info=extra_information, region=inferred_region, ) diff --git a/litellm/llms/openrouter/chat/transformation.py b/litellm/llms/openrouter/chat/transformation.py index d71724609d3..5af09cffbe1 100644 --- a/litellm/llms/openrouter/chat/transformation.py +++ b/litellm/llms/openrouter/chat/transformation.py @@ -61,25 +61,15 @@ class OpenrouterConfig(OpenAIGPTConfig): api_base: str | None, api_key: str | None, model: str, - optional_params: dict, # mutable-ok: overrides OpenAIGPTConfig.get_complete_url signature - litellm_params: dict, # mutable-ok: overrides OpenAIGPTConfig.get_complete_url signature + optional_params: dict, # pyright: ignore[reportMissingTypeArgument,reportUnknownParameterType] # mutable-ok: overrides OpenAIGPTConfig.get_complete_url signature + litellm_params: dict, # pyright: ignore[reportMissingTypeArgument,reportUnknownParameterType] # mutable-ok: overrides OpenAIGPTConfig.get_complete_url signature stream: bool | None = None, ) -> str: - casted_optional_params: Final[Mapping[str, object]] = ( - cast( # cast-ok: type discipline for untyped optional_params - Mapping[str, object], optional_params - ) - ) - casted_litellm_params: Final[Mapping[str, object]] = ( - cast( # cast-ok: type discipline for untyped litellm_params - Mapping[str, object], litellm_params - ) - ) resolved_base: Final = resolve_openrouter_api_base( api_base=api_base, region=self.region, - litellm_params=casted_litellm_params, - optional_params=casted_optional_params, + litellm_params=litellm_params, + optional_params=optional_params, ).rstrip("/") endpoint: Final = "chat/completions" if endpoint in resolved_base: diff --git a/litellm/llms/openrouter/data_residency.py b/litellm/llms/openrouter/data_residency.py index 5f1069f079d..3c23ec7552b 100644 --- a/litellm/llms/openrouter/data_residency.py +++ b/litellm/llms/openrouter/data_residency.py @@ -39,11 +39,11 @@ _OPENROUTER_REGIONAL_HOSTNAMES: Final[Mapping[str, str]] = MappingProxyType( _DEFAULT_OPENROUTER_API_BASE: Final[str] = "https://openrouter.ai/api/v1" -def _extract_region_value(params: Mapping[str, object] | None) -> str | None: - if params is None or not isinstance(params, Mapping): +def _extract_region_value(params: object) -> str | None: + if not isinstance(params, Mapping): return None for key in ("region", "region_name", "data_residency"): - val: Final[object] = params.get(key) + val: object = params.get(key) if isinstance(val, str) and val.strip(): return val.strip() return None @@ -51,9 +51,9 @@ def _extract_region_value(params: Mapping[str, object] | None) -> str | None: def resolve_openrouter_api_base( api_base: str | None = None, - region: str | None = None, - litellm_params: Mapping[str, object] | None = None, - optional_params: Mapping[str, object] | None = None, + region: object = None, + litellm_params: object = None, + optional_params: object = None, ) -> str: """ Resolve the OpenRouter API base URL based on custom api_base, explicit region, or environment. @@ -85,7 +85,8 @@ def resolve_openrouter_api_base( else (litellm_data_residency if isinstance(litellm_data_residency, str) else None) ) - resolved_region: Final[str | None] = region_from_params or region_from_optional or region or attr_region + explicit_region: Final[str | None] = region.strip() if isinstance(region, str) and region.strip() else None + resolved_region: Final[str | None] = region_from_params or region_from_optional or explicit_region or attr_region if resolved_region is not None: normalized_region: Final[str] = resolved_region.strip().lower() diff --git a/litellm/main.py b/litellm/main.py index 95219a9afa3..cd0c7171919 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -3413,29 +3413,18 @@ def _complete_openrouter(ctx: CompletionDispatchContext) -> _CompletionDispatchR stream: Final = ctx.stream timeout: Final = ctx.timeout - ## Load Config - config: Final = litellm.OpenrouterConfig.get_config() - casted_optional_params: Final[Mapping[str, object]] = cast( # cast-ok: type discipline for untyped optional_params - Mapping[str, object], optional_params - ) - raw_region: Final[object] = ( - litellm_params.get("region") - or litellm_params.get("region_name") - or litellm_params.get("data_residency") - or casted_optional_params.get("region") - or casted_optional_params.get("region_name") - or casted_optional_params.get("data_residency") - or getattr(ctx.provider_config, "region", None) - or getattr(litellm.OpenrouterConfig, "region", None) - ) - resolved_region: Final[str | None] = raw_region if isinstance(raw_region, str) else None api_base = resolve_openrouter_api_base( # rebind-ok: regional endpoint resolution for openrouter api_base=api_base, - region=resolved_region, + region=getattr(ctx.provider_config, "region", None) or getattr(litellm.OpenrouterConfig, "region", None), + litellm_params=litellm_params, + optional_params=optional_params, ) litellm_params["api_base"] = api_base litellm_params["data_residency"] = infer_openrouter_data_residency("openrouter", api_base) + ## Load Config + config: Final = litellm.OpenrouterConfig.get_config() + api_key = ( api_key or litellm.api_key @@ -6799,24 +6788,11 @@ def embedding( headers=headers, ) elif custom_llm_provider == "openrouter": - casted_optional_params: Final[Mapping[str, object]] = ( - cast( # cast-ok: type discipline for untyped optional_params - Mapping[str, object], optional_params - ) - ) - raw_region: Final[object] = ( - litellm_params_dict.get("region") - or litellm_params_dict.get("region_name") - or litellm_params_dict.get("data_residency") - or casted_optional_params.get("region") - or casted_optional_params.get("region_name") - or casted_optional_params.get("data_residency") - or getattr(litellm.OpenrouterConfig, "region", None) - ) - resolved_region: Final[str | None] = raw_region if isinstance(raw_region, str) else None api_base = resolve_openrouter_api_base( # rebind-ok: regional endpoint resolution for openrouter api_base=api_base, - region=resolved_region, + region=getattr(litellm.OpenrouterConfig, "region", None), + litellm_params=litellm_params_dict, + optional_params=optional_params, ) litellm_params_dict["api_base"] = api_base litellm_params_dict["data_residency"] = infer_openrouter_data_residency("openrouter", api_base)