From a77f23396137f6718eeffe7f9d8a56ef41bf103e Mon Sep 17 00:00:00 2001 From: sinksilk <785976238@qq.com> Date: Tue, 22 Sep 2026 23:32:20 +0800 Subject: [PATCH] fix(proxy): clear LIT002 in unreserved project IO token helpers Use immutable tuples and drop or-{} fallbacks so type_discipline_gate no longer blames the summary ITPM/OTPM path. Signed-off-by: sinksilk <785976238@qq.com> --- .../proxy/hooks/parallel_request_limiter_v3.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/litellm/proxy/hooks/parallel_request_limiter_v3.py b/litellm/proxy/hooks/parallel_request_limiter_v3.py index 2f3b10b07f6..1e08403083a 100644 --- a/litellm/proxy/hooks/parallel_request_limiter_v3.py +++ b/litellm/proxy/hooks/parallel_request_limiter_v3.py @@ -4641,7 +4641,7 @@ class _PROXY_MaxParallelRequestsHandler_v3(CustomLogger): self, standard_logging_metadata: Mapping[str, Any], model_group: str | None, - ) -> list[tuple[str, str]]: + ) -> Sequence[tuple[str, str]]: """Rebuild project ITPM/OTPM scopes from logging metadata. Combined TPM already charges ``model_per_project`` from metadata when @@ -4651,12 +4651,12 @@ class _PROXY_MaxParallelRequestsHandler_v3(CustomLogger): """ user_api_key_project_id: Final = standard_logging_metadata.get("user_api_key_project_id") if not user_api_key_project_id or not model_group: - return [] + return () descriptor_value: Final = f"{user_api_key_project_id}:{model_group}" - return [ # mutable-ok: caller may filter ITPM vs OTPM scopes + return ( (PROJECT_ITPM_DESCRIPTOR_KEY, descriptor_value), (PROJECT_OTPM_DESCRIPTOR_KEY, descriptor_value), - ] + ) def _build_unreserved_project_io_token_ops( self, @@ -4673,10 +4673,10 @@ class _PROXY_MaxParallelRequestsHandler_v3(CustomLogger): get_model_group_from_litellm_kwargs, ) - standard_logging_object: Final = kwargs.get("standard_logging_object") or {} + standard_logging_object: Final = kwargs.get("standard_logging_object") if not isinstance(standard_logging_object, dict): return () - standard_logging_metadata: Final = standard_logging_object.get("metadata") or {} + standard_logging_metadata: Final = standard_logging_object.get("metadata") if not isinstance(standard_logging_metadata, Mapping): return () @@ -4707,8 +4707,8 @@ class _PROXY_MaxParallelRequestsHandler_v3(CustomLogger): else (aggregate_total, aggregate_total, True) ) billable_input, completion_tokens, _ = resolved_usage - itpm_targets: Final = [t for t in targets if t[0] == PROJECT_ITPM_DESCRIPTOR_KEY] - otpm_targets: Final = [t for t in targets if t[0] == PROJECT_OTPM_DESCRIPTOR_KEY] + itpm_targets: Final = tuple(t for t in targets if t[0] == PROJECT_ITPM_DESCRIPTOR_KEY) + otpm_targets: Final = tuple(t for t in targets if t[0] == PROJECT_OTPM_DESCRIPTOR_KEY) return self._build_reservation_aware_tpm_ops( targets=itpm_targets, reserved_scopes=frozenset(),