diff --git a/litellm/proxy/auth/auth_checks.py b/litellm/proxy/auth/auth_checks.py index 8c680f079bd..093865e8f71 100644 --- a/litellm/proxy/auth/auth_checks.py +++ b/litellm/proxy/auth/auth_checks.py @@ -4267,7 +4267,7 @@ async def can_key_call_model( if key_access_group_ids: models_from_groups: Final = await _get_models_from_access_groups( access_group_ids=key_access_group_ids, - prisma_client=prisma_client, + prisma_client=prisma_client, # pyright: ignore[reportArgumentType] # DatabaseClient is the protocol this file passes everywhere ) if models_from_groups: return _can_object_call_model( @@ -4419,7 +4419,7 @@ async def can_team_access_model( if team_access_group_ids: models_from_groups: Final = await _get_models_from_access_groups( access_group_ids=team_access_group_ids, - prisma_client=prisma_client, + prisma_client=prisma_client, # pyright: ignore[reportArgumentType] # DatabaseClient is the protocol this file passes everywhere ) if models_from_groups: return _can_object_call_model( diff --git a/litellm/proxy/management_endpoints/model_management_endpoints.py b/litellm/proxy/management_endpoints/model_management_endpoints.py index a480190b776..cf9146d7a65 100644 --- a/litellm/proxy/management_endpoints/model_management_endpoints.py +++ b/litellm/proxy/management_endpoints/model_management_endpoints.py @@ -259,7 +259,7 @@ def _strategy_router_write_violation( if incoming_params is None: return None config_violation: Final = validate_complexity_router_config_write( - complexity_router_config=( + complexity_router_config=( # pyright: ignore[reportArgumentType] # _effective_* returns the stored Mapping or None _effective_complexity_router_config(incoming_params, existing_params) if incoming_params.complexity_router_config is not None else None diff --git a/litellm/proxy/management_helpers/auto_router_permissions.py b/litellm/proxy/management_helpers/auto_router_permissions.py index 449a1032b35..945ae65682e 100644 --- a/litellm/proxy/management_helpers/auto_router_permissions.py +++ b/litellm/proxy/management_helpers/auto_router_permissions.py @@ -226,7 +226,11 @@ async def authorize_member_auto_router_dependencies( if objects.organization is not None: can_org_access_model(model=model, org_object=objects.organization, llm_router=llm_router) if objects.project is not None: - can_project_access_model(model=model, project_object=objects.project, llm_router=llm_router) + can_project_access_model( + model=model, + project_object=objects.project, # pyright: ignore[reportArgumentType] # the project row satisfies the cached-object shape the checker needs + llm_router=llm_router, + ) async def _load_member_auto_router_dependency_objects( diff --git a/litellm/router_strategy/complexity_router/complexity_router.py b/litellm/router_strategy/complexity_router/complexity_router.py index 757da5b8f4c..c85d201fb65 100644 --- a/litellm/router_strategy/complexity_router/complexity_router.py +++ b/litellm/router_strategy/complexity_router/complexity_router.py @@ -1655,7 +1655,11 @@ class ComplexityRouter(CustomLogger): None if any( is_claude_code_user_agent(user_agent) - for metadata in (self._iter_metadata_dicts(request_kwargs) if request_kwargs is not None else ()) + for metadata in ( + self._iter_metadata_dicts(dict(request_kwargs)) # mutable-ok: resolve expects a plain dict + if request_kwargs is not None + else () + ) if isinstance(user_agent := metadata.get("user_agent"), str) ) else system_prompt @@ -1675,7 +1679,7 @@ class ComplexityRouter(CustomLogger): context_enabled: Final = bool(messages) and self.config.classifier_context_window_size > 0 prior_turns: Final = ( _extract_prior_turns( - messages, + messages or (), current_ask=prompt, window_size=self.config.classifier_context_window_size, budget_chars=self.config.classifier_context_budget_chars, @@ -1727,8 +1731,12 @@ class ComplexityRouter(CustomLogger): "ComplexityRouter: %s, falling back to %s", reason, self.config.classifier_fallback ) if self.config.classifier_fallback == "default_model": - outcome = self._default_model_fallback_outcome() - return outcome if signal is None else outcome._replace(signals=(*outcome.signals, signal)) + default_outcome: Final = self._default_model_fallback_outcome() + return ( + default_outcome + if signal is None + else default_outcome._replace(signals=(*default_outcome.signals, signal)) + ) if scored is not None: return scored if signal is None else scored._replace(signals=(*scored.signals, signal)) tier, score, signals, cause = self._score_and_classify(prompt, system_prompt) @@ -1755,10 +1763,16 @@ class ComplexityRouter(CustomLogger): kwargs: Final = request_kwargs if request_kwargs is not None else EMPTY_MAPPING pools: Final = self._tier_pools() try: + messages_for_resolve: Final = ( + list(raw_messages) # mutable-ok: resolve_structured_messages expects a plain list + if raw_messages is not None + else None + ) context: Final = RoutingContext( raw_messages=raw_messages or (), structured_messages=resolve_structured_messages( - messages=raw_messages, request_kwargs=request_kwargs or EMPTY_MAPPING + messages=messages_for_resolve, + request_kwargs=dict(request_kwargs or EMPTY_MAPPING), # mutable-ok: resolve expects a plain dict ) or (), candidate_models=tuple(model for pool in pools.values() for model in pool), @@ -1859,7 +1873,7 @@ class ComplexityRouter(CustomLogger): context_enabled: Final = bool(messages) and self.config.classifier_context_window_size > 0 prior_turns: Final = ( _extract_prior_turns( - messages, + messages or (), current_ask=prompt, window_size=self.config.classifier_context_window_size, budget_chars=self.config.classifier_context_budget_chars, diff --git a/litellm/router_strategy/complexity_router/jev_classifier.py b/litellm/router_strategy/complexity_router/jev_classifier.py index c0d0d1de8e3..fe59e3a338c 100644 --- a/litellm/router_strategy/complexity_router/jev_classifier.py +++ b/litellm/router_strategy/complexity_router/jev_classifier.py @@ -103,7 +103,12 @@ class HttpJevClassifierClient: ) response.raise_for_status() try: - self._log_response(request, response, request_kwargs, start_time) + self._log_response( + request, + response, # pyright: ignore[reportArgumentType] # AsyncHTTPHandler.post returns Response | None and raise_for_status already ran + request_kwargs, + start_time, + ) except Exception as exc: # noqa: BLE001 # logging integrations must not discard a provider verdict verbose_router_logger.warning("JEV response logging failed (%s)", type(exc).__name__) return TypeAdapter(JevSystemOneResponse).validate_python(response.json())