From 3dca3aee51016b7702789db1675d3a9e60234e50 Mon Sep 17 00:00:00 2001 From: Raphael Zanarelli Date: Thu, 8 Oct 2026 23:23:00 -0300 Subject: [PATCH] fix(openai): satisfy type-discipline and master-key CI gates Read ssl_verify through an isinstance-checked helper instead of repeated cast() calls, and use a non-reserved placeholder key in the new tests. Signed-off-by: Raphael Zanarelli --- litellm/llms/openai/openai.py | 24 +++++++++---------- .../llms/openai/test_openai_ssl_verify.py | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/litellm/llms/openai/openai.py b/litellm/llms/openai/openai.py index d3972bc7b5a..be208c1c096 100644 --- a/litellm/llms/openai/openai.py +++ b/litellm/llms/openai/openai.py @@ -1,3 +1,4 @@ +import ssl import time import types from collections.abc import AsyncIterator, Callable, Coroutine, Iterable, Iterator, Mapping @@ -67,6 +68,13 @@ openaiOSeriesConfig: Final = OpenAIOSeriesConfig() openAIGPT5Config: Final = OpenAIGPT5Config() +def _get_ssl_verify(litellm_params: Mapping[str, object] | None) -> VerifyTypes | None: + value: Final = litellm_params.get("ssl_verify") if litellm_params else None + if isinstance(value, (str, bool, ssl.SSLContext)): + return value + return None + + class MistralEmbeddingConfig: """ Reference: https://docs.mistral.ai/api/#operation/createEmbedding @@ -804,9 +812,7 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM): headers=headers or {}, ) if stream is True and fake_stream is False: - stream_ssl_verify: VerifyTypes | None = ( - cast(VerifyTypes | None, litellm_params.get("ssl_verify", None)) if litellm_params else None - ) + stream_ssl_verify: VerifyTypes | None = _get_ssl_verify(litellm_params) return self.streaming( logging_obj=logging_obj, headers=headers, @@ -826,9 +832,7 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM): else: if not isinstance(max_retries, int): raise OpenAIError(status_code=422, message="max retries must be an int") - ssl_verify: VerifyTypes | None = ( - cast(VerifyTypes | None, litellm_params.get("ssl_verify", None)) if litellm_params else None - ) + ssl_verify: VerifyTypes | None = _get_ssl_verify(litellm_params) openai_client: OpenAI = self._get_openai_client( is_async=False, api_key=api_key, @@ -972,9 +976,7 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM): ) for _ in range(2): # if call fails due to alternating messages, retry with reformatted message try: - ssl_verify: VerifyTypes | None = ( - cast(VerifyTypes | None, litellm_params.get("ssl_verify", None)) if litellm_params else None - ) + ssl_verify: VerifyTypes | None = _get_ssl_verify(litellm_params) openai_aclient: AsyncOpenAI = self._get_openai_client( is_async=True, api_key=api_key, @@ -1162,9 +1164,7 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM): data.update(self.get_stream_options(stream_options=stream_options, api_base=api_base)) for _ in range(2): try: - ssl_verify: VerifyTypes | None = ( - cast(VerifyTypes | None, litellm_params.get("ssl_verify", None)) if litellm_params else None - ) + ssl_verify: VerifyTypes | None = _get_ssl_verify(litellm_params) openai_aclient: AsyncOpenAI = self._get_openai_client( is_async=True, api_key=api_key, diff --git a/tests/unit/llms/openai/test_openai_ssl_verify.py b/tests/unit/llms/openai/test_openai_ssl_verify.py index 0f8742f6e49..e3a84d6c858 100644 --- a/tests/unit/llms/openai/test_openai_ssl_verify.py +++ b/tests/unit/llms/openai/test_openai_ssl_verify.py @@ -57,12 +57,12 @@ def test_cache_key_differs_by_ssl_verify(): Verify cache keys differ when ssl_verify differs to prevent client poisoning across CAs. """ params_ca1 = { - "api_key": "sk-1234", + "api_key": "sk-test-key", "is_async": True, "ssl_verify": "/path/ca1.pem", } params_ca2 = { - "api_key": "sk-1234", + "api_key": "sk-test-key", "is_async": True, "ssl_verify": "/path/ca2.pem", }