From 5bb33e6b8e04703533f75d45d7873cb26b50058b Mon Sep 17 00:00:00 2001 From: yyouretoast Date: Fri, 16 Oct 2026 17:49:55 +0300 Subject: [PATCH] fix(openrouter): align get_complete_url signature and eliminate basedpyright type errors --- .../llms/openrouter/chat/transformation.py | 10 +++-- litellm/llms/openrouter/data_residency.py | 15 +++---- .../openrouter/embedding/transformation.py | 9 ++-- litellm/main.py | 43 ++++++++++++------- 4 files changed, 47 insertions(+), 30 deletions(-) diff --git a/litellm/llms/openrouter/chat/transformation.py b/litellm/llms/openrouter/chat/transformation.py index daf4ca253eb..0988af3e062 100644 --- a/litellm/llms/openrouter/chat/transformation.py +++ b/litellm/llms/openrouter/chat/transformation.py @@ -61,15 +61,17 @@ class OpenrouterConfig(OpenAIGPTConfig): api_base: str | None, api_key: str | None, model: str, - optional_params: Mapping[str, object] | None = None, - litellm_params: Mapping[str, object] | None = None, + optional_params: dict, + litellm_params: dict, stream: bool | None = None, ) -> str: + casted_optional_params: Final[Mapping[str, object]] = cast(Mapping[str, object], optional_params) + casted_litellm_params: Final[Mapping[str, object]] = cast(Mapping[str, object], litellm_params) resolved_base: Final = resolve_openrouter_api_base( api_base=api_base, region=self.region, - litellm_params=litellm_params, - optional_params=optional_params, + litellm_params=casted_litellm_params, + optional_params=casted_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 bd0ee774c0d..5f1069f079d 100644 --- a/litellm/llms/openrouter/data_residency.py +++ b/litellm/llms/openrouter/data_residency.py @@ -39,22 +39,21 @@ _OPENROUTER_REGIONAL_HOSTNAMES: Final[Mapping[str, str]] = MappingProxyType( _DEFAULT_OPENROUTER_API_BASE: Final[str] = "https://openrouter.ai/api/v1" -def _extract_region_value(params: object) -> str | None: - if not isinstance(params, Mapping): +def _extract_region_value(params: Mapping[str, object] | None) -> str | None: + if params is None or not isinstance(params, Mapping): return None for key in ("region", "region_name", "data_residency"): - if key in params: - val: Final[object] = params[key] - if isinstance(val, str) and val.strip(): - return val.strip() + val: Final[object] = params.get(key) + if isinstance(val, str) and val.strip(): + return val.strip() return None def resolve_openrouter_api_base( api_base: str | None = None, region: str | None = None, - litellm_params: object = None, - optional_params: object = None, + litellm_params: Mapping[str, object] | None = None, + optional_params: Mapping[str, object] | None = None, ) -> str: """ Resolve the OpenRouter API base URL based on custom api_base, explicit region, or environment. diff --git a/litellm/llms/openrouter/embedding/transformation.py b/litellm/llms/openrouter/embedding/transformation.py index 54c8e8a20c9..22524dea137 100644 --- a/litellm/llms/openrouter/embedding/transformation.py +++ b/litellm/llms/openrouter/embedding/transformation.py @@ -7,7 +7,8 @@ OpenRouter is OpenAI-compatible and supports embeddings via the /v1/embeddings e Docs: https://openrouter.ai/docs """ -from typing import TYPE_CHECKING, Any, Final +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, Final, cast import httpx @@ -85,10 +86,12 @@ class OpenrouterEmbeddingConfig(BaseEmbeddingConfig): """ Get the complete URL for OpenRouter Embedding API endpoint. """ + casted_optional_params: Final[Mapping[str, object]] = cast(Mapping[str, object], optional_params) + casted_litellm_params: Final[Mapping[str, object]] = cast(Mapping[str, object], litellm_params) resolved_base: Final = resolve_openrouter_api_base( api_base=api_base, - litellm_params=litellm_params, - optional_params=optional_params, + litellm_params=casted_litellm_params, + optional_params=casted_optional_params, ).rstrip("/") # Return the embeddings endpoint diff --git a/litellm/main.py b/litellm/main.py index 581c307e889..d1e2c0e94ee 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -3415,20 +3415,24 @@ def _complete_openrouter(ctx: CompletionDispatchContext) -> _CompletionDispatchR ## Load Config config: Final = litellm.OpenrouterConfig.get_config() - config_region: Final[str | None] = ( - ctx.provider_config.region - if isinstance(ctx.provider_config, litellm.OpenrouterConfig) and isinstance(ctx.provider_config.region, str) - else (litellm.OpenrouterConfig.region if isinstance(litellm.OpenrouterConfig.region, str) else None) + casted_optional_params: Final[Mapping[str, object]] = cast(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=config_region, - litellm_params=litellm_params, - optional_params=optional_params, + region=resolved_region, ) - if litellm_params is not None: - litellm_params["api_base"] = api_base - litellm_params["data_residency"] = infer_openrouter_data_residency("openrouter", api_base) + litellm_params["api_base"] = api_base + litellm_params["data_residency"] = infer_openrouter_data_residency("openrouter", api_base) api_key = ( api_key @@ -6793,14 +6797,23 @@ def embedding( headers=headers, ) elif custom_llm_provider == "openrouter": + casted_optional_params: Final[Mapping[str, object]] = cast(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, - litellm_params=litellm_params_dict, - optional_params=optional_params, + region=resolved_region, ) - if litellm_params_dict is not None: - litellm_params_dict["api_base"] = api_base - litellm_params_dict["data_residency"] = infer_openrouter_data_residency("openrouter", api_base) + litellm_params_dict["api_base"] = api_base + litellm_params_dict["data_residency"] = infer_openrouter_data_residency("openrouter", api_base) api_key = ( api_key