From e88ee338bd06809ebf241834d5be9067012cb2b3 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Fri, 13 Mar 2026 11:21:49 -0700 Subject: [PATCH] [Fix] Resolve 7 mypy linting errors across 5 files - realtime_api/main.py: Widen param types to accept both Dict and Pydantic models - proxy/realtime_endpoints/endpoints.py: Widen return type to Union[..., Response] - proxy/guardrails/guardrail_hooks/presidio.py: Add type:ignore[override] for bytes in streaming return - proxy/_experimental/mcp_server/rest_endpoints.py: Annotate _oauth2_flow with Literal type - proxy/management_endpoints/ui_sso.py: Add httpx import under TYPE_CHECKING, remove invalid timeout kwarg from AsyncHTTPHandler.get() Co-Authored-By: Claude Opus 4.6 --- .../_experimental/mcp_server/rest_endpoints.py | 4 ++-- .../proxy/guardrails/guardrail_hooks/presidio.py | 6 +++++- litellm/proxy/management_endpoints/ui_sso.py | 4 +++- litellm/proxy/realtime_endpoints/endpoints.py | 4 ++-- litellm/realtime_api/main.py | 13 +++++++++---- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/litellm/proxy/_experimental/mcp_server/rest_endpoints.py b/litellm/proxy/_experimental/mcp_server/rest_endpoints.py index f681b17815..307caa2fbc 100644 --- a/litellm/proxy/_experimental/mcp_server/rest_endpoints.py +++ b/litellm/proxy/_experimental/mcp_server/rest_endpoints.py @@ -1,6 +1,6 @@ import importlib from datetime import datetime -from typing import Any, Awaitable, Callable, Dict, List, Optional, Set, Union +from typing import Any, Awaitable, Callable, Dict, List, Literal, Optional, Set, Union from fastapi import APIRouter, Depends, HTTPException, Query, Request @@ -905,7 +905,7 @@ if MCP_AVAILABLE: try: client_id, client_secret, scopes = _extract_credentials(request) - _oauth2_flow = ( + _oauth2_flow: Optional[Literal["client_credentials", "authorization_code"]] = ( "client_credentials" if client_id and client_secret and request.token_url else None diff --git a/litellm/proxy/guardrails/guardrail_hooks/presidio.py b/litellm/proxy/guardrails/guardrail_hooks/presidio.py index 5701f7dd9e..79c00948d5 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/presidio.py +++ b/litellm/proxy/guardrails/guardrail_hooks/presidio.py @@ -1234,9 +1234,13 @@ class _OPTIONAL_PresidioPIIMasking(CustomGuardrail): user_api_key_dict: UserAPIKeyAuth, response: Any, request_data: dict, - ) -> AsyncGenerator[Union[ModelResponseStream, bytes], None]: + ) -> AsyncGenerator[Union[ModelResponseStream, bytes], None]: # type: ignore[override] """ Process streaming response chunks to unmask PII tokens when needed. + + Note: the return type includes `bytes` because Anthropic native SSE + streaming sends raw bytes chunks that pass through untransformed. + The base class declares ModelResponseStream only. """ if self.apply_to_output: async for chunk in self._stream_apply_output_masking( diff --git a/litellm/proxy/management_endpoints/ui_sso.py b/litellm/proxy/management_endpoints/ui_sso.py index f3998ab2b4..d55aa85a9b 100644 --- a/litellm/proxy/management_endpoints/ui_sso.py +++ b/litellm/proxy/management_endpoints/ui_sso.py @@ -17,6 +17,9 @@ import secrets from copy import deepcopy from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Tuple, Union, cast +if TYPE_CHECKING: + import httpx + import jwt from fastapi import APIRouter, Depends, HTTPException, Request, status from fastapi.responses import RedirectResponse @@ -2984,7 +2987,6 @@ class SSOAuthenticationHandler: **additional_headers, "Authorization": f"Bearer {access_token}", # must not be overridden }, - timeout=30.0, ) if resp.status_code == 200: try: diff --git a/litellm/proxy/realtime_endpoints/endpoints.py b/litellm/proxy/realtime_endpoints/endpoints.py index 0a91112298..4c0a407c0e 100644 --- a/litellm/proxy/realtime_endpoints/endpoints.py +++ b/litellm/proxy/realtime_endpoints/endpoints.py @@ -2,7 +2,7 @@ import json import time -from typing import Any, Dict, Optional +from typing import Any, Dict, Optional, Union import httpx from fastapi import APIRouter, Depends, HTTPException, Request, Response @@ -89,7 +89,7 @@ async def create_realtime_client_secret( request: Request, fastapi_response: Response, user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), -) -> RealtimeClientSecretResponse: +) -> Union[RealtimeClientSecretResponse, Response]: from litellm.proxy.proxy_server import ( add_litellm_data_to_request, general_settings, diff --git a/litellm/realtime_api/main.py b/litellm/realtime_api/main.py index 7dcdc0d8d9..92e221577f 100644 --- a/litellm/realtime_api/main.py +++ b/litellm/realtime_api/main.py @@ -1,7 +1,7 @@ """Abstraction function for OpenAI's realtime API""" import os -from typing import Any, Dict, Optional, cast +from typing import Any, Dict, Optional, Union, cast import litellm from litellm.constants import REALTIME_WEBSOCKET_MAX_MESSAGE_SIZE_BYTES, request_timeout @@ -9,7 +9,12 @@ from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider from litellm.llms.base_llm.realtime.transformation import BaseRealtimeConfig from litellm.llms.custom_httpx.llm_http_handler import BaseLLMHTTPHandler from litellm.secret_managers.main import get_secret_str -from litellm.types.realtime import RealtimeClientSecretRequest, RealtimeQueryParams +from litellm.types.realtime import ( + RealtimeClientSecretRequest, + RealtimeExpiresAfter, + RealtimeQueryParams, + RealtimeSessionConfig, +) from litellm.types.router import GenericLiteLLMParams from litellm.types.utils import LlmProviders from litellm.utils import ProviderConfigManager @@ -93,8 +98,8 @@ def _get_realtime_http_provider_config( @wrapper_client async def acreate_realtime_client_secret( model: Optional[str] = None, - session: Optional[Dict[str, Any]] = None, - expires_after: Optional[Dict[str, Any]] = None, + session: Optional[Union[Dict[str, Any], RealtimeSessionConfig]] = None, + expires_after: Optional[Union[Dict[str, Any], RealtimeExpiresAfter]] = None, timeout: Optional[float] = None, **kwargs, ):