
    h6                         d Z ddlZddlmZmZ ddlZddlmZ ddlm	Z	 ddl
mZmZ ddlmZ ddlmZmZmZ dd	lmZ d
dlmZ  G d dee      Zy)zv
Supports writing files to Google AI Studio Files API.

For vertex ai, check out the vertex_ai/files/handler.py file.
    N)ListOptional)verbose_logger)extract_file_data)BaseFilesConfigLiteLLMLoggingObj)GeminiCreateFilesResponseObject)CreateFileRequest%OpenAICreateFileRequestOptionalParamsOpenAIFileObject)LlmProviders   )GeminiModelInfoc                       e Zd Zd Zedefd       Z	 ddee   dee   dede	d	e	d
ee
   defdZdedee   fdZde	de	dede
de	f
dZdedede	d	e	de	f
dZdee   dej&                  ded	e	def
dZy)GoogleAIStudioFilesHandlerc                      y N selfs    d/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/gemini/files/transformation.py__init__z#GoogleAIStudioFilesHandler.__init__   s        returnc                 "    t         j                  S r   )r   GEMINIr   s    r   custom_llm_providerz.GoogleAIStudioFilesHandler.custom_llm_provider    s    """r   Napi_baseapi_keymodeloptional_paramslitellm_paramsstreamc                     d}| j                  |      }|st        d      |st        d      dj                  |||      }|S )z{
        OPTIONAL

        Get the complete url for the request

        Some providers need `model` in `api_base`
        zupload/v1beta/fileszapi_base is requiredzapi_key is requiredz{}/{}?key={})get_api_base
ValueErrorformat)	r   r   r   r    r!   r"   r#   endpointurls	            r   get_complete_urlz+GoogleAIStudioFilesHandler.get_complete_url$   sP      )$$X.344233##Hh@
r   c                     g S r   r   )r   r    s     r   get_supported_openai_paramsz6GoogleAIStudioFilesHandler.get_supported_openai_params?   s	     	r   non_default_paramsdrop_paramsc                     |S r   r   )r   r-   r!   r    r.   s        r   map_openai_paramsz,GoogleAIStudioFilesHandler.map_openai_paramsD   s
     r   create_file_datac                 \   |j                  d      }|t        d      t        |      }t        |d         }ddt	        |      |d   dd}|j                  |d	          dd
|d   xs& t	        t        t        j                                     ii}	t	        |      ddd}
||	d|
|d   ddS )z
        Transform the OpenAI-style file creation request into Gemini's format

        Returns:
            dict: Contains both request data and headers for the two-step upload
        filezFile data is requiredcontent	resumablestartcontent_typezapplication/json)zX-Goog-Upload-ProtocolX-Goog-Upload-Commandz#X-Goog-Upload-Header-Content-Lengthz!X-Goog-Upload-Header-Content-TypezContent-Typeheadersdisplay_namefilename0zupload, finalize)zContent-LengthzX-Goog-Upload-Offsetr8   )r9   data)initial_requestupload_request)getr&   r   lenstrupdateinttime)r   r    r1   r!   r"   	file_dataextracted_data	file_sizer9   initial_dataupload_headerss              r   transform_create_file_requestz8GoogleAIStudioFilesHandler.transform_create_file_requestM   s     %((0	455 +95 y12	 '2%,36y>1?1O.
 	~i01 z : Sc#diikBR>S
 ")n$'%7
 ,3LI)&y1
 	
r   raw_responselogging_objc                    	 |j                         }t        di |j                  di       }t        |d   t	        |d         t	        t        j                  t        j                  |d   j                  dd      d                  |d   dd	d
d      S # t        $ r=}t        j                  dt        |              t        dt        |             d}~ww xY w)zV
        Transform Gemini's file upload response into OpenAI-style FileObject
        r3   uri	sizeBytes
createTimeZz+00:00z%Y-%m-%dT%H:%M:%S.%f%zdisplayName	user_datauploadedN)idbytes
created_atr;   objectpurposestatusstatus_detailsz$Error parsing file upload response: r   )jsonr	   r@   r   rD   rE   mktimestrptimereplace	Exceptionr   	exceptionrB   r&   )r   r    rL   rM   r"   response_jsonresponse_objectes           r   transform_create_file_responsez9GoogleAIStudioFilesHandler.transform_create_file_response   s    	N(--/M= ##FB/O $"5)#K0 KK+L9AA#xP4 )7#!## &  	N$$'KCPQF8%TUCCF8LMM	Ns   BB 	C8CCr   )__name__
__module____qualname__r   propertyr   r   r   rB   dictboolr*   r   r   r,   r0   r
   rK   httpxResponser   r   rf   r   r   r   r   r      sE    #\ # # "&3- # 	
    
6	3	4
   	
  
6
6
 ,6
 	6

 6
 
6
p(N}(N nn(N '	(N
 (N 
(Nr   r   )__doc__rE   typingr   r   rm   litellm._loggingr   8litellm.litellm_core_utils.prompt_templates.common_utilsr   *litellm.llms.base_llm.files.transformationr   r   litellm.types.llms.geminir	   litellm.types.llms.openair
   r   r   litellm.types.utilsr   common_utilsr   r   r   r   r   <module>rx      sJ   
  !  + V F 
 - *QN/ QNr   