From 40b3e4359329b8760b40211345ea280dde2a7e5e Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Mon, 28 Apr 2025 14:42:47 -0700 Subject: [PATCH] Add typing for litellm.moderation response obj --- .../convert_dict_to_response.py | 17 +++++++++++++---- litellm/main.py | 16 ++++++++++++---- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/litellm/litellm_core_utils/llm_response_utils/convert_dict_to_response.py b/litellm/litellm_core_utils/llm_response_utils/convert_dict_to_response.py index 5a8319a7471..e412e3f35f1 100644 --- a/litellm/litellm_core_utils/llm_response_utils/convert_dict_to_response.py +++ b/litellm/litellm_core_utils/llm_response_utils/convert_dict_to_response.py @@ -10,7 +10,10 @@ import litellm from litellm._logging import verbose_logger from litellm.constants import RESPONSE_FORMAT_TOOL_NAME from litellm.types.llms.databricks import DatabricksTool -from litellm.types.llms.openai import ChatCompletionThinkingBlock +from litellm.types.llms.openai import ( + ChatCompletionThinkingBlock, + OpenAIModerationResponse, +) from litellm.types.utils import ( ChatCompletionDeltaToolCall, ChatCompletionMessageToolCall, @@ -297,6 +300,12 @@ class LiteLLMResponseObjectHandler: model_response_object = ImageResponse(**model_response_dict) return model_response_object + @staticmethod + def convert_to_moderation_response( + response_object: dict, + ) -> OpenAIModerationResponse: + return OpenAIModerationResponse(**response_object) + @staticmethod def convert_chat_to_text_completion( response: ModelResponse, @@ -500,9 +509,9 @@ def convert_to_model_response_object( # noqa: PLR0915 provider_specific_fields["thinking_blocks"] = thinking_blocks if reasoning_content: - provider_specific_fields[ - "reasoning_content" - ] = reasoning_content + provider_specific_fields["reasoning_content"] = ( + reasoning_content + ) message = Message( content=content, diff --git a/litellm/main.py b/litellm/main.py index ff21824fac5..150617cd283 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -183,6 +183,7 @@ from .types.llms.openai import ( ChatCompletionUserMessage, HttpxBinaryResponseContent, ImageGenerationRequestQuality, + OpenAIModerationResponse, ) from .types.utils import ( LITELLM_IMAGE_VARIATION_PROVIDERS, @@ -4436,7 +4437,7 @@ def adapter_completion( def moderation( input: str, model: Optional[str] = None, api_key: Optional[str] = None, **kwargs -): +) -> OpenAIModerationResponse: # only supports open ai for now api_key = ( api_key @@ -4455,7 +4456,11 @@ def moderation( response = openai_client.moderations.create(input=input, model=model) else: response = openai_client.moderations.create(input=input) - return response + + response_dict: Dict = response.model_dump() + return litellm.utils.LiteLLMResponseObjectHandler.convert_to_moderation_response( + response_object=response_dict, + ) @client @@ -4465,7 +4470,7 @@ async def amoderation( api_key: Optional[str] = None, custom_llm_provider: Optional[str] = None, **kwargs, -): +) -> OpenAIModerationResponse: from openai import AsyncOpenAI # only supports open ai for now @@ -4506,7 +4511,10 @@ async def amoderation( response = await _openai_client.moderations.create(input=input, model=model) else: response = await _openai_client.moderations.create(input=input) - return response + response_dict: Dict = response.model_dump() + return litellm.utils.LiteLLMResponseObjectHandler.convert_to_moderation_response( + response_object=response_dict, + ) ##### Image Generation #######################