fix(mypy): resolve missing return statements and type casting issues#20618
fix(mypy): resolve missing return statements and type casting issues#20618ishaan-jaff merged 2 commits intomainfrom
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Shin seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account. You have signed the CLA already but the status is still pending? Let us recheck it. |
Greptile OverviewGreptile Summary
Confidence Score: 4/5
|
| Filename | Overview |
|---|---|
| litellm/litellm_core_utils/token_counter.py | Casts text/thinking content block values to str before token counting to satisfy TokenCounterFunction typing; behavior change is minimal (non-str values now count as their string representation). |
| litellm/proxy/guardrails/guardrail_hooks/pangea/pangea.py | Adds typing imports and cast() for data.get("messages") in post-call hook; current logic can pass None as messages and has branch overlap around TextCompletionResponse vs ModelResponse. |
| litellm/responses/litellm_completion_transformation/handler.py | Adds explicit raise ValueError in sync/async response handlers to satisfy mypy 'missing return' by handling unexpected completion response types. |
Sequence Diagram
sequenceDiagram
participant Caller
participant Handler as LiteLLMCompletionTransformationHandler
participant LiteLLM as litellm
participant Transform as LiteLLMCompletionResponsesConfig
participant StreamIter as LiteLLMCompletionStreamingIterator
participant Pangea as PangeaHandler
Caller->>Handler: response_api_handler(...)
Handler->>Transform: transform_responses_api_request_to_chat_completion_request(...)
alt _is_async
Handler->>Handler: async_response_api_handler(...)
Handler->>LiteLLM: acompletion(**args)
else sync
Handler->>LiteLLM: completion(**args)
end
alt ModelResponse
Handler->>Transform: transform_chat_completion_response_to_responses_api_response(...)
Handler-->>Caller: ResponsesAPIResponse
else CustomStreamWrapper
Handler->>StreamIter: new StreamingIterator(...)
Handler-->>Caller: Streaming iterator
else Unexpected type
Handler-->>Caller: raise ValueError
end
Note over Pangea: In proxy guardrails, post_call hook
Caller->>Pangea: async_post_call_success_hook(data, response)
Pangea->>Pangea: _async_post_call_success_hook(...)
alt response is TextCompletionResponse
Pangea->>Pangea: input_messages = _TextCompletionRequest(data).get_messages()
end
alt response is ModelResponse
Pangea->>Pangea: input_messages = cast(List[Dict[Any,Any]], data.get("messages"))
Pangea->>Pangea: _call_pangea_ai_guard("v1beta/guard", payload)
else not ModelResponse
Pangea-->>Caller: return
end
Additional Comments (1)
|
…ssages
Address Greptile review feedback:
- Make branches mutually exclusive using elif to prevent input_messages from being overwritten
- Handle case where data.get('messages') returns None to avoid passing invalid payload to Pangea API
|
@greptile can you review again |
Greptile OverviewGreptile SummaryFixed three mypy type checking issues to ensure clean static type analysis:
All changes are defensive type safety improvements with no behavioral changes to the runtime logic. Confidence Score: 5/5
|
| Filename | Overview |
|---|---|
| litellm/responses/litellm_completion_transformation/handler.py | Added explicit raise statements after if-elif chains to satisfy mypy type checking for return statements in both sync and async handlers |
| litellm/litellm_core_utils/token_counter.py | Added str() casts for text and thinking content blocks to ensure count_function receives string type as expected |
| litellm/proxy/guardrails/guardrail_hooks/pangea/pangea.py | Refactored control flow from nested if-not-isinstance to if-elif-else structure with explicit type cast for messages, improving type safety and clarity |
Sequence Diagram
sequenceDiagram
participant MyPy as MyPy Type Checker
participant Handler as handler.py
participant TokenCounter as token_counter.py
participant Pangea as pangea.py
Note over MyPy,Pangea: Mypy Type Checking Issues
MyPy->>Handler: Check return paths in response_api_handler()
Handler-->>MyPy: Error: Not all code paths return a value
Note over Handler: Fixed: Added raise after if-elif chain
MyPy->>TokenCounter: Check _count_content_list() types
TokenCounter-->>MyPy: Error: c.get() may not return str type
Note over TokenCounter: Fixed: Cast c.get("text") and c.get("thinking") to str
MyPy->>Pangea: Check _async_post_call_success_hook() types
Pangea-->>MyPy: Error: messages type not explicitly cast
Note over Pangea: Fixed: Refactored to if-elif-else with cast()
…ng format for Claude Code (#20631) * Add http support to custom code guardrails + Unified guardrails for MCP + Agent guardrail support (#20619) * fix: fix styling * fix(custom_code_guardrail.py): add http support for custom code guardrails allows users to call external guardrails on litellm with minimal code changes (no custom handlers) Test guardrail integrations more easily * feat(a2a/): add guardrails for agent interactions allows the same guardrails for llm's to be applied to agents as well * fix(a2a/): support passing guardrails to a2a from the UI * style(code-editor): allow editing custom code guardrails on ui + add examples of pre/post calls for custom code guardrails * feat(mcp/): support custom code guardrails for mcp calls allows custom code guardrails to work on mcp input * feat(chatui.tsx): support guardrails on mcp tool calls on playground * fix(mypy): resolve missing return statements and type casting issues (#20618) * fix(mypy): resolve missing return statements and type casting issues * fix(pangea): use elif to prevent UnboundLocalError and handle None messages Address Greptile review feedback: - Make branches mutually exclusive using elif to prevent input_messages from being overwritten - Handle case where data.get('messages') returns None to avoid passing invalid payload to Pangea API --------- Co-authored-by: Shin <shin@openclaw.ai> * [Feat] MCP Gateway - Allow setting MCP Servers as Private/Public available on Internet (#20607) * update MCPAuthenticatedUser * add available_on_public_internet for MCPs * update claude.md * init IPAddressUtils * init available_on_public_internet * add on REST endpoints * filter with IP * TestIsInternalIp * _extract_mcp_headers_from_request * init get_mcp_client_ip * _get_general_settings * allowed_server_ids * address PR comments * get_mcp_server_by_name fix * fix server * fix review comments * get_public_mcp_servers * address _get_allowed_mcp_servers * fixing user_id * [Feat] IP-Based Access Control for MCP Servers (#20620) * update MCPAuthenticatedUser * add available_on_public_internet for MCPs * update claude.md * init IPAddressUtils * init available_on_public_internet * add on REST endpoints * filter with IP * TestIsInternalIp * _extract_mcp_headers_from_request * init get_mcp_client_ip * _get_general_settings * allowed_server_ids * address PR comments * get_mcp_server_by_name fix * fix server * fix review comments * get_public_mcp_servers * address _get_allowed_mcp_servers * test fix * fix linting * inint ui types * add ui for managing MCP private/public * add ui * fixes * add to schema * add types * fix endpoint * add endpoint * update manager * test mcp * dont use external party for ip address * Add OpenAI/Azure release test suite with HTTP client lifecycle regression detection (#20622) * docs (#20626) * docs * fix(mypy): resolve type checking errors in 5 files (#20627) - a2a_protocol/exception_mapping_utils.py: Fix type ignore comment for None assignment - caching/redis_cache.py: Add type ignore for async ping return type - caching/redis_cluster_cache.py: Add type ignore for async ping return type - llms/deprecated_providers/palm.py: Add type ignore for palm.generate_text - proxy/auth/handle_jwt.py: Add type ignore for jwt.decode options argument All changes add appropriate type: ignore comments to handle library typing inconsistencies. * fix(test): update deprecated gemini embedding model (#20621) Replace text-embedding-004 with gemini-embedding-001. The old model was deprecated and returns 404: 'models/text-embedding-004 is not found for API version v1beta' Co-authored-by: Shin <shin@openclaw.ai> * ui new buil * fix(websearch_interception): convert agentic loop response to streaming format when original request was streaming Fixes #20187 - When using websearch_interception in Bedrock with Claude Code: 1. Output tokens were showing as 0 because the agentic loop response wasn't being converted back to streaming format 2. The response from the agentic loop (follow-up request) was returned as a non-streaming dict, but Claude Code expects a streaming response This fix adds streaming format conversion for the agentic loop response when the original request was streaming (detected via the websearch_interception_converted_stream flag in logging_obj). The fix ensures: - Output tokens are correctly included in the message_delta event - stop_reason is properly preserved - The response format matches what Claude Code expects --------- Co-authored-by: Krish Dholakia <krrishdholakia@gmail.com> Co-authored-by: Shin <shin@openclaw.ai> Co-authored-by: Ishaan Jaff <ishaanjaffer0324@gmail.com> Co-authored-by: yuneng-jiang <yuneng.jiang@gmail.com> Co-authored-by: Alexsander Hamir <alexsanderhamirgomesbaptista@gmail.com>
…iohttp tracing (#20630) * Add http support to custom code guardrails + Unified guardrails for MCP + Agent guardrail support (#20619) * fix: fix styling * fix(custom_code_guardrail.py): add http support for custom code guardrails allows users to call external guardrails on litellm with minimal code changes (no custom handlers) Test guardrail integrations more easily * feat(a2a/): add guardrails for agent interactions allows the same guardrails for llm's to be applied to agents as well * fix(a2a/): support passing guardrails to a2a from the UI * style(code-editor): allow editing custom code guardrails on ui + add examples of pre/post calls for custom code guardrails * feat(mcp/): support custom code guardrails for mcp calls allows custom code guardrails to work on mcp input * feat(chatui.tsx): support guardrails on mcp tool calls on playground * fix(mypy): resolve missing return statements and type casting issues (#20618) * fix(mypy): resolve missing return statements and type casting issues * fix(pangea): use elif to prevent UnboundLocalError and handle None messages Address Greptile review feedback: - Make branches mutually exclusive using elif to prevent input_messages from being overwritten - Handle case where data.get('messages') returns None to avoid passing invalid payload to Pangea API --------- Co-authored-by: Shin <shin@openclaw.ai> * [Feat] MCP Gateway - Allow setting MCP Servers as Private/Public available on Internet (#20607) * update MCPAuthenticatedUser * add available_on_public_internet for MCPs * update claude.md * init IPAddressUtils * init available_on_public_internet * add on REST endpoints * filter with IP * TestIsInternalIp * _extract_mcp_headers_from_request * init get_mcp_client_ip * _get_general_settings * allowed_server_ids * address PR comments * get_mcp_server_by_name fix * fix server * fix review comments * get_public_mcp_servers * address _get_allowed_mcp_servers * fixing user_id * [Feat] IP-Based Access Control for MCP Servers (#20620) * update MCPAuthenticatedUser * add available_on_public_internet for MCPs * update claude.md * init IPAddressUtils * init available_on_public_internet * add on REST endpoints * filter with IP * TestIsInternalIp * _extract_mcp_headers_from_request * init get_mcp_client_ip * _get_general_settings * allowed_server_ids * address PR comments * get_mcp_server_by_name fix * fix server * fix review comments * get_public_mcp_servers * address _get_allowed_mcp_servers * test fix * fix linting * inint ui types * add ui for managing MCP private/public * add ui * fixes * add to schema * add types * fix endpoint * add endpoint * update manager * test mcp * dont use external party for ip address * Add OpenAI/Azure release test suite with HTTP client lifecycle regression detection (#20622) * docs (#20626) * docs * fix(mypy): resolve type checking errors in 5 files (#20627) - a2a_protocol/exception_mapping_utils.py: Fix type ignore comment for None assignment - caching/redis_cache.py: Add type ignore for async ping return type - caching/redis_cluster_cache.py: Add type ignore for async ping return type - llms/deprecated_providers/palm.py: Add type ignore for palm.generate_text - proxy/auth/handle_jwt.py: Add type ignore for jwt.decode options argument All changes add appropriate type: ignore comments to handle library typing inconsistencies. * fix(test): update deprecated gemini embedding model (#20621) Replace text-embedding-004 with gemini-embedding-001. The old model was deprecated and returns 404: 'models/text-embedding-004 is not found for API version v1beta' Co-authored-by: Shin <shin@openclaw.ai> * ui new buil * fix(http_handler): bypass cache when shared_session is provided for aiohttp tracing When users pass a shared_session with trace_configs to acompletion(), the get_async_httpx_client() function was ignoring it and returning a cached client without the user's tracing configuration. This fix bypasses the cache when shared_session is provided, ensuring the user's ClientSession (with its trace_configs, connector settings, etc.) is actually used for the request. Fixes #20174 --------- Co-authored-by: Krish Dholakia <krrishdholakia@gmail.com> Co-authored-by: Shin <shin@openclaw.ai> Co-authored-by: Ishaan Jaff <ishaanjaffer0324@gmail.com> Co-authored-by: yuneng-jiang <yuneng.jiang@gmail.com> Co-authored-by: Alexsander Hamir <alexsanderhamirgomesbaptista@gmail.com> Co-authored-by: shin-bot-litellm <shin-bot-litellm@users.noreply.github.com>
Mypy Regression Fix
Pipeline: #57774
Fixes
handler.py- Add explicit raise for unexpected response types (missing return statement)token_counter.py- Cast dict values to str before passing to count_functionpangea.py- Add type cast for messages assignmentTesting
python -m mypy litellm/responses/litellm_completion_transformation/handler.py litellm/litellm_core_utils/token_counter.py litellm/proxy/guardrails/guardrail_hooks/pangea/pangea.py --ignore-missing-importsto verify