diff --git a/enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py b/enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py index 1a08a8f9101..7823a7eb251 100644 --- a/enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py +++ b/enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py @@ -13,7 +13,7 @@ from litellm.types.llms.openai import ( from litellm.types.utils import ChatCompletionMessageToolCall, Message, ModelResponse if TYPE_CHECKING: - from litellm.responses.litellm_completion_transformation.transformation import ( + from litellm.responses.litellm_completion_transformation import ( ChatCompletionSession, ) else: @@ -28,7 +28,7 @@ class _ENTERPRISE_ResponsesSessionHandler: """ Return the chat completion message history for a previous response id """ - from litellm.responses.litellm_completion_transformation.transformation import ( + from litellm.responses.litellm_completion_transformation import ( ChatCompletionSession, LiteLLMCompletionResponsesConfig, ) diff --git a/litellm/llms/gemini/realtime/transformation.py b/litellm/llms/gemini/realtime/transformation.py index 980723eb3fe..470e1e466df 100644 --- a/litellm/llms/gemini/realtime/transformation.py +++ b/litellm/llms/gemini/realtime/transformation.py @@ -13,7 +13,7 @@ from litellm.llms.base_llm.realtime.transformation import BaseRealtimeConfig from litellm.llms.vertex_ai.gemini.vertex_and_google_ai_studio_gemini import ( VertexGeminiConfig, ) -from litellm.responses.litellm_completion_transformation.transformation import ( +from litellm.responses.litellm_completion_transformation import ( LiteLLMCompletionResponsesConfig, ) from litellm.types.llms.gemini import ( diff --git a/litellm/responses/litellm_completion_transformation/__init__.py b/litellm/responses/litellm_completion_transformation/__init__.py new file mode 100644 index 00000000000..a69e50df7ba --- /dev/null +++ b/litellm/responses/litellm_completion_transformation/__init__.py @@ -0,0 +1,13 @@ +from .responses_to_completion_bridge.handler import ( + LiteLLMCompletionTransformationHandler, +) +from .responses_to_completion_bridge.transformation import ( + ChatCompletionSession, + LiteLLMCompletionResponsesConfig, +) + +__all__ = [ + "LiteLLMCompletionTransformationHandler", + "ChatCompletionSession", + "LiteLLMCompletionResponsesConfig", +] diff --git a/litellm/responses/litellm_completion_transformation/handler.py b/litellm/responses/litellm_completion_transformation/responses_to_completion_bridge/handler.py similarity index 71% rename from litellm/responses/litellm_completion_transformation/handler.py rename to litellm/responses/litellm_completion_transformation/responses_to_completion_bridge/handler.py index f960092f2bf..1f144f78042 100644 --- a/litellm/responses/litellm_completion_transformation/handler.py +++ b/litellm/responses/litellm_completion_transformation/responses_to_completion_bridge/handler.py @@ -5,12 +5,6 @@ Handler for transforming responses api requests to litellm.completion requests from typing import Any, Coroutine, Optional, Union import litellm -from litellm.responses.litellm_completion_transformation.streaming_iterator import ( - LiteLLMCompletionStreamingIterator, -) -from litellm.responses.litellm_completion_transformation.transformation import ( - LiteLLMCompletionResponsesConfig, -) from litellm.responses.streaming_iterator import BaseResponsesAPIStreamingIterator from litellm.types.llms.openai import ( ResponseInputParam, @@ -19,9 +13,11 @@ from litellm.types.llms.openai import ( ) from litellm.types.utils import ModelResponse +from .streaming_iterator import LiteLLMCompletionStreamingIterator +from .transformation import LiteLLMCompletionResponsesConfig + class LiteLLMCompletionTransformationHandler: - def response_api_handler( self, model: str, @@ -38,15 +34,13 @@ class LiteLLMCompletionTransformationHandler: Any, Any, Union[ResponsesAPIResponse, BaseResponsesAPIStreamingIterator] ], ]: - litellm_completion_request: dict = ( - LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request( - model=model, - input=input, - responses_api_request=responses_api_request, - custom_llm_provider=custom_llm_provider, - stream=stream, - **kwargs, - ) + litellm_completion_request: dict = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request( + model=model, + input=input, + responses_api_request=responses_api_request, + custom_llm_provider=custom_llm_provider, + stream=stream, + **kwargs, ) if _is_async: @@ -65,12 +59,10 @@ class LiteLLMCompletionTransformationHandler: ) if isinstance(litellm_completion_response, ModelResponse): - responses_api_response: ResponsesAPIResponse = ( - LiteLLMCompletionResponsesConfig.transform_chat_completion_response_to_responses_api_response( - chat_completion_response=litellm_completion_response, - request_input=input, - responses_api_request=responses_api_request, - ) + responses_api_response: ResponsesAPIResponse = LiteLLMCompletionResponsesConfig.transform_chat_completion_response_to_responses_api_response( + chat_completion_response=litellm_completion_response, + request_input=input, + responses_api_request=responses_api_request, ) return responses_api_response @@ -89,7 +81,6 @@ class LiteLLMCompletionTransformationHandler: responses_api_request: ResponsesAPIOptionalRequestParams, **kwargs, ) -> Union[ResponsesAPIResponse, BaseResponsesAPIStreamingIterator]: - previous_response_id: Optional[str] = responses_api_request.get( "previous_response_id" ) @@ -107,12 +98,10 @@ class LiteLLMCompletionTransformationHandler: ) if isinstance(litellm_completion_response, ModelResponse): - responses_api_response: ResponsesAPIResponse = ( - LiteLLMCompletionResponsesConfig.transform_chat_completion_response_to_responses_api_response( - chat_completion_response=litellm_completion_response, - request_input=request_input, - responses_api_request=responses_api_request, - ) + responses_api_response: ResponsesAPIResponse = LiteLLMCompletionResponsesConfig.transform_chat_completion_response_to_responses_api_response( + chat_completion_response=litellm_completion_response, + request_input=request_input, + responses_api_request=responses_api_request, ) return responses_api_response diff --git a/litellm/responses/litellm_completion_transformation/streaming_iterator.py b/litellm/responses/litellm_completion_transformation/responses_to_completion_bridge/streaming_iterator.py similarity index 98% rename from litellm/responses/litellm_completion_transformation/streaming_iterator.py rename to litellm/responses/litellm_completion_transformation/responses_to_completion_bridge/streaming_iterator.py index 6f2d5bc185f..fd47edce476 100644 --- a/litellm/responses/litellm_completion_transformation/streaming_iterator.py +++ b/litellm/responses/litellm_completion_transformation/responses_to_completion_bridge/streaming_iterator.py @@ -2,7 +2,7 @@ from typing import List, Optional, Union import litellm from litellm.main import stream_chunk_builder -from litellm.responses.litellm_completion_transformation.transformation import ( +from litellm.responses.litellm_completion_transformation import ( LiteLLMCompletionResponsesConfig, ) from litellm.responses.streaming_iterator import ResponsesAPIStreamingIterator @@ -144,7 +144,6 @@ class LiteLLMCompletionStreamingIterator(ResponsesAPIStreamingIterator): Union[ModelResponse, TextCompletionResponse] ] = stream_chunk_builder(chunks=self.collected_chat_completion_chunks) if litellm_model_response and isinstance(litellm_model_response, ModelResponse): - return ResponseCompletedEvent( type=ResponsesAPIStreamEvents.RESPONSE_COMPLETED, response=LiteLLMCompletionResponsesConfig.transform_chat_completion_response_to_responses_api_response( diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/responses_to_completion_bridge/transformation.py similarity index 100% rename from litellm/responses/litellm_completion_transformation/transformation.py rename to litellm/responses/litellm_completion_transformation/responses_to_completion_bridge/transformation.py diff --git a/litellm/responses/main.py b/litellm/responses/main.py index fded67285fd..0b68b41b71d 100644 --- a/litellm/responses/main.py +++ b/litellm/responses/main.py @@ -10,7 +10,7 @@ from litellm.constants import request_timeout from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj from litellm.llms.base_llm.responses.transformation import BaseResponsesAPIConfig from litellm.llms.custom_httpx.llm_http_handler import BaseLLMHTTPHandler -from litellm.responses.litellm_completion_transformation.handler import ( +from litellm.responses.litellm_completion_transformation import ( LiteLLMCompletionTransformationHandler, ) from litellm.responses.utils import ResponsesAPIRequestUtils @@ -191,11 +191,11 @@ def responses( ) # get provider config - responses_api_provider_config: Optional[BaseResponsesAPIConfig] = ( - ProviderConfigManager.get_provider_responses_api_config( - model=model, - provider=litellm.LlmProviders(custom_llm_provider), - ) + responses_api_provider_config: Optional[ + BaseResponsesAPIConfig + ] = ProviderConfigManager.get_provider_responses_api_config( + model=model, + provider=litellm.LlmProviders(custom_llm_provider), ) local_vars.update(kwargs) @@ -385,11 +385,11 @@ def delete_responses( raise ValueError("custom_llm_provider is required but passed as None") # get provider config - responses_api_provider_config: Optional[BaseResponsesAPIConfig] = ( - ProviderConfigManager.get_provider_responses_api_config( - model=None, - provider=litellm.LlmProviders(custom_llm_provider), - ) + responses_api_provider_config: Optional[ + BaseResponsesAPIConfig + ] = ProviderConfigManager.get_provider_responses_api_config( + model=None, + provider=litellm.LlmProviders(custom_llm_provider), ) if responses_api_provider_config is None: @@ -564,11 +564,11 @@ def get_responses( raise ValueError("custom_llm_provider is required but passed as None") # get provider config - responses_api_provider_config: Optional[BaseResponsesAPIConfig] = ( - ProviderConfigManager.get_provider_responses_api_config( - model=None, - provider=litellm.LlmProviders(custom_llm_provider), - ) + responses_api_provider_config: Optional[ + BaseResponsesAPIConfig + ] = ProviderConfigManager.get_provider_responses_api_config( + model=None, + provider=litellm.LlmProviders(custom_llm_provider), ) if responses_api_provider_config is None: @@ -720,11 +720,11 @@ def list_input_items( if custom_llm_provider is None: raise ValueError("custom_llm_provider is required but passed as None") - responses_api_provider_config: Optional[BaseResponsesAPIConfig] = ( - ProviderConfigManager.get_provider_responses_api_config( - model=None, - provider=litellm.LlmProviders(custom_llm_provider), - ) + responses_api_provider_config: Optional[ + BaseResponsesAPIConfig + ] = ProviderConfigManager.get_provider_responses_api_config( + model=None, + provider=litellm.LlmProviders(custom_llm_provider), ) if responses_api_provider_config is None: diff --git a/tests/llm_translation/test_openai.py b/tests/llm_translation/test_openai.py index 62cfe8cf6bc..1da6be73e44 100644 --- a/tests/llm_translation/test_openai.py +++ b/tests/llm_translation/test_openai.py @@ -469,3 +469,15 @@ async def test_openai_pdf_url(model): assert "file_data" in request["raw_request_body"]["messages"][0]["content"][1]["file"] + + +def test_openai_codex(): + from litellm import completion + + response = completion( + model="openai/codex-mini-latest", + messages=[{"role": "user", "content": "Hey!"}], + ) + print("response: ", response) + + assert response.choices[0].message.content is not None \ No newline at end of file diff --git a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py index 77ecb48382f..572081bc6be 100644 --- a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py +++ b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py @@ -10,7 +10,7 @@ sys.path.insert( 0, os.path.abspath("../../..") ) # Adds the parent directory to the system path -from litellm.responses.litellm_completion_transformation.transformation import ( +from litellm.responses.litellm_completion_transformation import ( LiteLLMCompletionResponsesConfig, )