Spaces:
Paused
Paused
| from typing import Any, Coroutine, Optional, Union, cast | |
| import httpx | |
| from openai import AsyncAzureOpenAI, AzureOpenAI | |
| from openai.types.file_deleted import FileDeleted | |
| from litellm._logging import verbose_logger | |
| from litellm.types.llms.openai import * | |
| from ..common_utils import BaseAzureLLM | |
| class AzureOpenAIFilesAPI(BaseAzureLLM): | |
| """ | |
| AzureOpenAI methods to support for batches | |
| - create_file() | |
| - retrieve_file() | |
| - list_files() | |
| - delete_file() | |
| - file_content() | |
| - update_file() | |
| """ | |
| def __init__(self) -> None: | |
| super().__init__() | |
| async def acreate_file( | |
| self, | |
| create_file_data: CreateFileRequest, | |
| openai_client: AsyncAzureOpenAI, | |
| ) -> OpenAIFileObject: | |
| verbose_logger.debug("create_file_data=%s", create_file_data) | |
| response = await openai_client.files.create(**create_file_data) | |
| verbose_logger.debug("create_file_response=%s", response) | |
| return OpenAIFileObject(**response.model_dump()) | |
| def create_file( | |
| self, | |
| _is_async: bool, | |
| create_file_data: CreateFileRequest, | |
| api_base: Optional[str], | |
| api_key: Optional[str], | |
| api_version: Optional[str], | |
| timeout: Union[float, httpx.Timeout], | |
| max_retries: Optional[int], | |
| client: Optional[Union[AzureOpenAI, AsyncAzureOpenAI]] = None, | |
| litellm_params: Optional[dict] = None, | |
| ) -> Union[OpenAIFileObject, Coroutine[Any, Any, OpenAIFileObject]]: | |
| openai_client: Optional[ | |
| Union[AzureOpenAI, AsyncAzureOpenAI] | |
| ] = self.get_azure_openai_client( | |
| litellm_params=litellm_params or {}, | |
| api_key=api_key, | |
| api_base=api_base, | |
| api_version=api_version, | |
| client=client, | |
| _is_async=_is_async, | |
| ) | |
| if openai_client is None: | |
| raise ValueError( | |
| "AzureOpenAI client is not initialized. Make sure api_key is passed or OPENAI_API_KEY is set in the environment." | |
| ) | |
| if _is_async is True: | |
| if not isinstance(openai_client, AsyncAzureOpenAI): | |
| raise ValueError( | |
| "AzureOpenAI client is not an instance of AsyncAzureOpenAI. Make sure you passed an AsyncAzureOpenAI client." | |
| ) | |
| return self.acreate_file( | |
| create_file_data=create_file_data, openai_client=openai_client | |
| ) | |
| response = cast(AzureOpenAI, openai_client).files.create(**create_file_data) | |
| return OpenAIFileObject(**response.model_dump()) | |
| async def afile_content( | |
| self, | |
| file_content_request: FileContentRequest, | |
| openai_client: AsyncAzureOpenAI, | |
| ) -> HttpxBinaryResponseContent: | |
| response = await openai_client.files.content(**file_content_request) | |
| return HttpxBinaryResponseContent(response=response.response) | |
| def file_content( | |
| self, | |
| _is_async: bool, | |
| file_content_request: FileContentRequest, | |
| api_base: Optional[str], | |
| api_key: Optional[str], | |
| timeout: Union[float, httpx.Timeout], | |
| max_retries: Optional[int], | |
| api_version: Optional[str] = None, | |
| client: Optional[Union[AzureOpenAI, AsyncAzureOpenAI]] = None, | |
| litellm_params: Optional[dict] = None, | |
| ) -> Union[ | |
| HttpxBinaryResponseContent, Coroutine[Any, Any, HttpxBinaryResponseContent] | |
| ]: | |
| openai_client: Optional[ | |
| Union[AzureOpenAI, AsyncAzureOpenAI] | |
| ] = self.get_azure_openai_client( | |
| litellm_params=litellm_params or {}, | |
| api_key=api_key, | |
| api_base=api_base, | |
| api_version=api_version, | |
| client=client, | |
| _is_async=_is_async, | |
| ) | |
| if openai_client is None: | |
| raise ValueError( | |
| "AzureOpenAI client is not initialized. Make sure api_key is passed or OPENAI_API_KEY is set in the environment." | |
| ) | |
| if _is_async is True: | |
| if not isinstance(openai_client, AsyncAzureOpenAI): | |
| raise ValueError( | |
| "AzureOpenAI client is not an instance of AsyncAzureOpenAI. Make sure you passed an AsyncAzureOpenAI client." | |
| ) | |
| return self.afile_content( # type: ignore | |
| file_content_request=file_content_request, | |
| openai_client=openai_client, | |
| ) | |
| response = cast(AzureOpenAI, openai_client).files.content( | |
| **file_content_request | |
| ) | |
| return HttpxBinaryResponseContent(response=response.response) | |
| async def aretrieve_file( | |
| self, | |
| file_id: str, | |
| openai_client: AsyncAzureOpenAI, | |
| ) -> FileObject: | |
| response = await openai_client.files.retrieve(file_id=file_id) | |
| return response | |
| def retrieve_file( | |
| self, | |
| _is_async: bool, | |
| file_id: str, | |
| api_base: Optional[str], | |
| api_key: Optional[str], | |
| timeout: Union[float, httpx.Timeout], | |
| max_retries: Optional[int], | |
| api_version: Optional[str] = None, | |
| client: Optional[Union[AzureOpenAI, AsyncAzureOpenAI]] = None, | |
| litellm_params: Optional[dict] = None, | |
| ): | |
| openai_client: Optional[ | |
| Union[AzureOpenAI, AsyncAzureOpenAI] | |
| ] = self.get_azure_openai_client( | |
| litellm_params=litellm_params or {}, | |
| api_key=api_key, | |
| api_base=api_base, | |
| api_version=api_version, | |
| client=client, | |
| _is_async=_is_async, | |
| ) | |
| if openai_client is None: | |
| raise ValueError( | |
| "AzureOpenAI client is not initialized. Make sure api_key is passed or OPENAI_API_KEY is set in the environment." | |
| ) | |
| if _is_async is True: | |
| if not isinstance(openai_client, AsyncAzureOpenAI): | |
| raise ValueError( | |
| "AzureOpenAI client is not an instance of AsyncAzureOpenAI. Make sure you passed an AsyncAzureOpenAI client." | |
| ) | |
| return self.aretrieve_file( # type: ignore | |
| file_id=file_id, | |
| openai_client=openai_client, | |
| ) | |
| response = openai_client.files.retrieve(file_id=file_id) | |
| return response | |
| async def adelete_file( | |
| self, | |
| file_id: str, | |
| openai_client: AsyncAzureOpenAI, | |
| ) -> FileDeleted: | |
| response = await openai_client.files.delete(file_id=file_id) | |
| if not isinstance(response, FileDeleted): # azure returns an empty string | |
| return FileDeleted(id=file_id, deleted=True, object="file") | |
| return response | |
| def delete_file( | |
| self, | |
| _is_async: bool, | |
| file_id: str, | |
| api_base: Optional[str], | |
| api_key: Optional[str], | |
| timeout: Union[float, httpx.Timeout], | |
| max_retries: Optional[int], | |
| organization: Optional[str] = None, | |
| api_version: Optional[str] = None, | |
| client: Optional[Union[AzureOpenAI, AsyncAzureOpenAI]] = None, | |
| litellm_params: Optional[dict] = None, | |
| ): | |
| openai_client: Optional[ | |
| Union[AzureOpenAI, AsyncAzureOpenAI] | |
| ] = self.get_azure_openai_client( | |
| litellm_params=litellm_params or {}, | |
| api_key=api_key, | |
| api_base=api_base, | |
| api_version=api_version, | |
| client=client, | |
| _is_async=_is_async, | |
| ) | |
| if openai_client is None: | |
| raise ValueError( | |
| "AzureOpenAI client is not initialized. Make sure api_key is passed or OPENAI_API_KEY is set in the environment." | |
| ) | |
| if _is_async is True: | |
| if not isinstance(openai_client, AsyncAzureOpenAI): | |
| raise ValueError( | |
| "AzureOpenAI client is not an instance of AsyncAzureOpenAI. Make sure you passed an AsyncAzureOpenAI client." | |
| ) | |
| return self.adelete_file( # type: ignore | |
| file_id=file_id, | |
| openai_client=openai_client, | |
| ) | |
| response = openai_client.files.delete(file_id=file_id) | |
| if not isinstance(response, FileDeleted): # azure returns an empty string | |
| return FileDeleted(id=file_id, deleted=True, object="file") | |
| return response | |
| async def alist_files( | |
| self, | |
| openai_client: AsyncAzureOpenAI, | |
| purpose: Optional[str] = None, | |
| ): | |
| if isinstance(purpose, str): | |
| response = await openai_client.files.list(purpose=purpose) | |
| else: | |
| response = await openai_client.files.list() | |
| return response | |
| def list_files( | |
| self, | |
| _is_async: bool, | |
| api_base: Optional[str], | |
| api_key: Optional[str], | |
| timeout: Union[float, httpx.Timeout], | |
| max_retries: Optional[int], | |
| purpose: Optional[str] = None, | |
| api_version: Optional[str] = None, | |
| client: Optional[Union[AzureOpenAI, AsyncAzureOpenAI]] = None, | |
| litellm_params: Optional[dict] = None, | |
| ): | |
| openai_client: Optional[ | |
| Union[AzureOpenAI, AsyncAzureOpenAI] | |
| ] = self.get_azure_openai_client( | |
| litellm_params=litellm_params or {}, | |
| api_key=api_key, | |
| api_base=api_base, | |
| api_version=api_version, | |
| client=client, | |
| _is_async=_is_async, | |
| ) | |
| if openai_client is None: | |
| raise ValueError( | |
| "AzureOpenAI client is not initialized. Make sure api_key is passed or OPENAI_API_KEY is set in the environment." | |
| ) | |
| if _is_async is True: | |
| if not isinstance(openai_client, AsyncAzureOpenAI): | |
| raise ValueError( | |
| "AzureOpenAI client is not an instance of AsyncAzureOpenAI. Make sure you passed an AsyncAzureOpenAI client." | |
| ) | |
| return self.alist_files( # type: ignore | |
| purpose=purpose, | |
| openai_client=openai_client, | |
| ) | |
| if isinstance(purpose, str): | |
| response = openai_client.files.list(purpose=purpose) | |
| else: | |
| response = openai_client.files.list() | |
| return response | |