From 229add205b22f12f6cb1cb4bdb24002748fcfd2a Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 16 Sep 2026 08:08:54 +0000 Subject: [PATCH] refactor: drop suppressions that no longer suppress anything (2026-09-16) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../chat/guardrail_translation/handler.py | 26 ++++++------------- .../nvidia_nim/passthrough/transformation.py | 2 +- .../proxy/hooks/proxy_track_cost_callback.py | 2 +- .../management_helpers/bulk_user_creation.py | 6 ++--- .../management_helpers/bulk_user_deletion.py | 2 +- litellm/responses/streaming_iterator.py | 2 +- .../complexity_router/complexity_router.py | 4 +-- 7 files changed, 17 insertions(+), 27 deletions(-) diff --git a/litellm/llms/anthropic/chat/guardrail_translation/handler.py b/litellm/llms/anthropic/chat/guardrail_translation/handler.py index 2ea20143f0c..6e528f9ba4b 100644 --- a/litellm/llms/anthropic/chat/guardrail_translation/handler.py +++ b/litellm/llms/anthropic/chat/guardrail_translation/handler.py @@ -199,9 +199,7 @@ def _write_back_system_block(system: object, block_idx: int, response: str) -> N return text_blocks: Final = tuple(block for block in system if isinstance(block, dict) and block.get("type") == "text") if block_idx < len(text_blocks): - text_blocks[block_idx]["text"] = ( - response # mutable-ok: guardrails rewrite the caller's request payload in place - ) + text_blocks[block_idx]["text"] = response def _write_back_message_text(message: _WritableMessage, target: MessageTextTarget, response: str) -> None: @@ -211,22 +209,16 @@ def _write_back_message_text(message: _WritableMessage, target: MessageTextTarge match target: case MessageContentTarget(): if isinstance(content, str): - message["content"] = response # mutable-ok: guardrails rewrite the caller's request payload in place + message["content"] = response case ContentBlockTextTarget(content_idx=content_idx): if isinstance(content, list): - content[content_idx]["text"] = ( - response # mutable-ok: guardrails rewrite the caller's request payload in place - ) + content[content_idx]["text"] = response case ToolResultStringTarget(content_idx=content_idx): if isinstance(content, list): - content[content_idx]["content"] = ( - response # mutable-ok: guardrails rewrite the caller's request payload in place - ) + content[content_idx]["content"] = response case ToolResultBlockTextTarget(content_idx=content_idx, block_idx=block_idx): if isinstance(content, list): - content[content_idx]["content"][block_idx]["text"] = ( - response # mutable-ok: guardrails rewrite the caller's request payload in place - ) + content[content_idx]["content"][block_idx]["text"] = response case _: assert_never(target) @@ -248,9 +240,9 @@ def _write_back_tool_use( block: Final = content[target.content_idx] if isinstance(content, list) else None if not isinstance(block, dict): return - block["input"] = rewritten_input # mutable-ok: guardrails rewrite the caller's request payload in place + block["input"] = rewritten_input if shape.name is not None and shape.name != block.get("name"): - block["name"] = shape.name # mutable-ok: guardrails rewrite the caller's request payload in place + block["name"] = shape.name @dataclass(frozen=True, slots=True) @@ -606,9 +598,7 @@ class AnthropicMessagesHandler(BaseTranslation): image for one_message in extracted for image in one_message.images ] # mutable-ok: GenericGuardrailAPIInputs takes list[str] scanned_tool_calls: Final = tuple(item for one_message in extracted for item in one_message.tool_calls) - tool_calls_to_check: Final = [ - item.tool_call for item in scanned_tool_calls - ] # mutable-ok: GenericGuardrailAPIInputs takes list[ChatCompletionToolCallChunk] + tool_calls_to_check: Final = [item.tool_call for item in scanned_tool_calls] pre_guardrail_tool_calls: Final = _tool_call_shapes(tool_calls_to_check) # Step 2: Apply guardrail to all texts and tool calls in batch diff --git a/litellm/llms/nvidia_nim/passthrough/transformation.py b/litellm/llms/nvidia_nim/passthrough/transformation.py index 7de1ce4d631..e8e7da8e10b 100644 --- a/litellm/llms/nvidia_nim/passthrough/transformation.py +++ b/litellm/llms/nvidia_nim/passthrough/transformation.py @@ -110,7 +110,7 @@ class NvidiaNimPassthroughConfig(BasePassthroughConfig): return { **headers, "Authorization": f"Bearer {api_key}", - } # mutable-ok: base class contract returns dict for httpx + } @staticmethod def get_api_base(api_base: str | None = None) -> str | None: diff --git a/litellm/proxy/hooks/proxy_track_cost_callback.py b/litellm/proxy/hooks/proxy_track_cost_callback.py index 1ae106be390..412112e3419 100644 --- a/litellm/proxy/hooks/proxy_track_cost_callback.py +++ b/litellm/proxy/hooks/proxy_track_cost_callback.py @@ -734,7 +734,7 @@ async def _reconcile_budget_reservation_before_db_update( "Failed to invalidate budget reservation counters after pre-persist reconcile failed" ) finally: - budget_reservation["finalized"] = True # rebind-ok: the counter update reads the stamp off the shared dict + budget_reservation["finalized"] = True # rebind-ok: the counter update reads the finalized stamp off the caller's shared dict # fmt: skip async def _release_budget_reservation(budget_reservation: dict | None) -> None: diff --git a/litellm/proxy/management_helpers/bulk_user_creation.py b/litellm/proxy/management_helpers/bulk_user_creation.py index 56abe3b6a3f..ec8fd312766 100644 --- a/litellm/proxy/management_helpers/bulk_user_creation.py +++ b/litellm/proxy/management_helpers/bulk_user_creation.py @@ -348,7 +348,7 @@ async def _prepare_user(user: _PendingUser, prisma_client: PrismaClient) -> _Pre data: Final = {**dumped, "user_id": user.user_id} # mutable-ok: /user/new defaults helper mutates in place data_json: Final = _JSON_OBJECT.validate_python(_update_internal_new_user_params(data, user.request)) with_permission: Final = _JSON_OBJECT.validate_python( - await _set_object_permission(data_json=data_json, prisma_client=prisma_client) # pyright: ignore[reportUnknownArgumentType] # validated by the adapter + await _set_object_permission(data_json=data_json, prisma_client=prisma_client) ) return _PreparedUser(user, _USER_ROW.validate_python(with_permission)) except Exception as exc: # noqa: BLE001 # any preparation failure is reported on this row only @@ -509,7 +509,7 @@ class _TeamsData(TypedDict): def _default_member_budget_id(team: LiteLLM_TeamTable) -> str | None: metadata: Final = ( _JSON_OBJECT.validate_python( - team.metadata # pyright: ignore[reportUnknownMemberType, reportUnknownArgumentType] # LiteLLM_TeamTable.metadata is a bare dict; validated by the adapter + team.metadata # pyright: ignore[reportUnknownMemberType] # LiteLLM_TeamTable.metadata is a bare dict; validated by the adapter ) if team.metadata # pyright: ignore[reportUnknownMemberType] # same bare dict else None @@ -543,7 +543,7 @@ async def _write_team_roster( already_present: Final = frozenset(member.user_id for member in roster if member.user_id) new_members: Final = tuple(member for member in members if member.user_id not in already_present) budget_ids: Final = tuple( - [ # mutable-ok: budgets are created one at a time on the transaction's single connection + [ await _resolve_member_budget_id( prisma_client=prisma_client, user_api_key_dict=user_api_key_dict, diff --git a/litellm/proxy/management_helpers/bulk_user_deletion.py b/litellm/proxy/management_helpers/bulk_user_deletion.py index 1ae83b0004a..57edddef345 100644 --- a/litellm/proxy/management_helpers/bulk_user_deletion.py +++ b/litellm/proxy/management_helpers/bulk_user_deletion.py @@ -187,7 +187,7 @@ def _error_message(exc: BaseException) -> str: if isinstance(exc, HTTPException) and isinstance(exc.detail, dict): return str(exc.detail.get("error", exc.detail)) # pyright: ignore[reportUnknownMemberType, reportUnknownArgumentType] # HTTPException.detail is untyped if isinstance(exc, HTTPException): - return str(exc.detail) # pyright: ignore[reportUnknownArgumentType] # HTTPException.detail is untyped + return str(exc.detail) return str(exc) or type(exc).__name__ diff --git a/litellm/responses/streaming_iterator.py b/litellm/responses/streaming_iterator.py index 8d766cf1cd0..8559450e6ef 100644 --- a/litellm/responses/streaming_iterator.py +++ b/litellm/responses/streaming_iterator.py @@ -1351,7 +1351,7 @@ def _billed_terminal_response( return None usage: Final[object] = response_obj.get("usage") # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType] # a model_constructed terminal event leaves response as an untyped dict return ResponsesAPIResponse.model_construct( - **{**response_obj, "usage": usage if usage is not None or estimate is None else estimate()} # pyright: ignore[reportUnknownArgumentType, reportArgumentType] # same untyped dict spread + **{**response_obj, "usage": usage if usage is not None or estimate is None else estimate()} # pyright: ignore[reportArgumentType] # same untyped dict spread ) diff --git a/litellm/router_strategy/complexity_router/complexity_router.py b/litellm/router_strategy/complexity_router/complexity_router.py index d19cdfaa899..1248dbe973c 100644 --- a/litellm/router_strategy/complexity_router/complexity_router.py +++ b/litellm/router_strategy/complexity_router/complexity_router.py @@ -1057,7 +1057,7 @@ def _with_classifier_forecast( if forecast is None: return decision verdict: Final = forecast.verdict - enriched: Final[StandardLoggingRoutingDecision] = { # mutable-ok: routing decisions are JSON TypedDict records + enriched: Final[StandardLoggingRoutingDecision] = { **decision, "classifier_crux": verdict.crux, "classifier_primary_rule": verdict.primary_rule, @@ -2292,7 +2292,7 @@ class ComplexityRouter(CustomLogger): {"role": "user", "content": opening_task}, # mutable-ok: SDK messages are dict-shaped ] if latest_follow_up is not None: - task_messages.append( # mutable-ok: the provider SDK requires a concrete message list + task_messages.append( {"role": "user", "content": latest_follow_up} # mutable-ok: SDK messages are dict-shaped )