o
    ưie9                     @   s   d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
 d dlZd dlmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZ erid dlm Z! ddl"m#Z$ e!Z%e$Z#neZ%eZ#G dd deZ&dS )    )BufferedReader)TYPE_CHECKINGAnyDictListOptionalTupleUnioncastN)RequestFiles)BaseVideoConfig)ImageEditRequestUtils)get_secret_str)CreateVideoRequest)GenericLiteLLMParams) VideoCreateOptionalRequestParamsVideoObject)encode_video_id_with_providerextract_original_video_id)Logging   BaseLLMExceptionc                       s  e Zd ZdZ fddZdedefddZdeded	e	de
fd
dZ		dCdededee dee def
ddZdedee dedefddZdededede
dededee
eef fddZ		dCdedejdedee dee
 defddZ	dDdedededed ee deee
f fd!d"Z	dDdededededed#ee
eef  deee
f fd$d%Zdejdedefd&d'Z	dDdejdedee defd(d)Z				dEdededed*ee d+ee d,ee d-ee
eef  deee
f fd.d/Z 	dDdejdedee de
eef fd0d1Z!dededededeee
f f
d2d3Z"dejdedefd4d5Z#dededededeee
f f
d6d7Z$	dDdejdedee defd8d9Z%d:ed;ede&eej'f de(fd<d=Z)d>e*eeef  d?ed@eddfdAdBZ+  Z,S )FOpenAIVideoConfigz:
    Configuration class for OpenAI video generation.
    c                    s   t    d S N)super__init__)self	__class__ `/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/openai/videos/transformation.pyr   $   s   zOpenAIVideoConfig.__init__modelreturnc                 C   s   g dS )zS
        Get the list of supported OpenAI parameters for video generation.
        )r"   promptinput_referencesecondssizeuserextra_headersr    )r   r"   r    r    r!   get_supported_openai_params'   s   z-OpenAIVideoConfig.get_supported_openai_paramsvideo_create_optional_paramsdrop_paramsc                 C   s   t |S )z:No mapping applied since inputs are in OpenAI spec already)dict)r   r+   r"   r,   r    r    r!   map_openai_params5   s   z#OpenAIVideoConfig.map_openai_paramsNheadersapi_keylitellm_paramsc                 C   sD   |r
|j r
|p	|j }|ptj ptjptd}|dd| i |S )NZOPENAI_API_KEYAuthorizationzBearer )r0   litellmZ
openai_keyr   update)r   r/   r"   r0   r1   r    r    r!   validate_environment>   s   


z&OpenAIVideoConfig.validate_environmentapi_basec                 C   s   |du rd}| d dS )zC
        Get the complete URL for OpenAI video generation.
        Nzhttps://api.openai.com/v1/z/videos)rstrip)r   r"   r6   r1   r    r    r!   get_complete_urlV   s   	z"OpenAIVideoConfig.get_complete_urlr$   $video_create_optional_request_paramsc                 C   sr   dd |  D }td||d|}tt|}|d}	dd |  D }
g }|	dur4| j||	dd |
||fS )	zF
        Transform the video creation request for OpenAI API.
        c                 S      i | ]\}}|d vr||qS ))r"   r)   r$   r    .0kvr    r    r!   
<dictcomp>q   s
    zDOpenAIVideoConfig.transform_video_create_request.<locals>.<dictcomp>)r"   r$   r%   c                 S   r;   ))r%   r    r<   r    r    r!   r@      s    N)
files_listimage
field_namer    )itemsr   r
   r   get_add_image_to_files)r   r"   r$   r6   r:   r1   r/   Zvideo_create_requestZrequest_dictZ_input_referenceZdata_without_filesrA   r    r    r!   transform_video_create_requestd   s,   


z0OpenAIVideoConfig.transform_video_create_requestraw_responselogging_objcustom_llm_providerrequest_datac           	   	   C   s|   |  }tdi |}|r|jrt|j|||_i }|r9t|dr9|jr9z	t|j|d< W n ttfy8   Y nw ||_	|S )z-Transform the OpenAI video creation response.r&   duration_secondsNr    
jsonr   idr   hasattrr&   float
ValueError	TypeErrorusage)	r   r"   rH   rI   rJ   rK   response_data	video_obj
usage_datar    r    r!   transform_video_create_response   s   	
z1OpenAIVideoConfig.transform_video_create_responsevideo_idvariantc           	      C   s@   t |}|d d| d}|dur| d| }i }||fS )z
        Transform the video content request for OpenAI API.

        OpenAI API expects the following request:
        - GET /v1/videos/{video_id}/content
        - GET /v1/videos/{video_id}/content?variant=thumbnail
        r7   z/contentNz	?variant=r   r8   )	r   rY   r6   r1   r/   rZ   original_video_idurldatar    r    r!   transform_video_content_request   s   z1OpenAIVideoConfig.transform_video_content_request
extra_bodyc           
      C   s<   t |}|d d| d}d|i}	|r|	| ||	fS )z
        Transform the video remix request for OpenAI API.
        
        OpenAI API expects the following request:
        - POST /v1/videos/{video_id}/remix
        r7   z/remixr$   )r   r8   r4   )
r   rY   r$   r6   r1   r/   r`   r\   r]   r^   r    r    r!   transform_video_remix_request   s   
z/OpenAIVideoConfig.transform_video_remix_requestc                 C   s   |j S )z5Transform the OpenAI video content download response.)content)r   rH   rI   r    r    r!    transform_video_content_response   s   z2OpenAIVideoConfig.transform_video_content_responsec              	   C   s|   |  }tdi |}|r|jrt|j|d|_i }|r9t|dr9|jr9z	t|j|d< W n ttfy8   Y nw ||_	|S )z<
        Transform the OpenAI video remix response.
        Nr&   rL   r    rM   )r   rH   rI   rJ   rU   rV   rW   r    r    r!   transform_video_remix_response   s   	
z0OpenAIVideoConfig.transform_video_remix_responseafterlimitorderextra_queryc           
      C   sV   |}i }	|durt ||	d< |durt||	d< |dur ||	d< |r'|	| ||	fS )z
        Transform the video list request for OpenAI API.

        OpenAI API expects the following request:
        - GET /v1/videos
        Nre   rf   rg   )r   strr4   )
r   r6   r1   r/   re   rf   rg   rh   r]   paramsr    r    r!   transform_video_list_request  s   
z.OpenAIVideoConfig.transform_video_list_requestc           	      C   s   |  }|rqd|v rq|dg D ]}t|tr(d|v r(t|d ||d|d< q|dg }|drPd }|rFt|d trF|d d}t|d |||d< |drqd }|rgt|d trg|d d}t|d |||d< |S )Nr^   rO   r"   Zfirst_idr   Zlast_id)rN   rE   
isinstancer-   r   )	r   rH   rI   rJ   rU   rV   Z	data_listZfirst_modelZ
last_modelr    r    r!   transform_video_list_response+  s<   

z/OpenAIVideoConfig.transform_video_list_responsec                 C   (   t |}|d d| }i }||fS )z
        Transform the video delete request for OpenAI API.
        
        OpenAI API expects the following request:
        - DELETE /v1/videos/{video_id}
        r7   r[   r   rY   r6   r1   r/   r\   r]   r^   r    r    r!   transform_video_delete_requestT  s   z0OpenAIVideoConfig.transform_video_delete_requestc                 C   s   |  }tdi |}|S )z=
        Transform the OpenAI video delete response.
        Nr    )rN   r   )r   rH   rI   rU   rV   r    r    r!   transform_video_delete_responsek  s   z1OpenAIVideoConfig.transform_video_delete_responsec                 C   ro   )z>
        Transform the OpenAI video retrieve request.
        r7   r[   rp   r    r    r!   'transform_video_status_retrieve_requestz  s   z9OpenAIVideoConfig.transform_video_status_retrieve_requestc                 C   s4   |  }tdi |}|r|jrt|j|d|_|S )z?
        Transform the OpenAI video retrieve response.
        Nr    )rN   r   rO   r   )r   rH   rI   rJ   rU   rV   r    r    r!   (transform_video_status_retrieve_response  s
   	
z:OpenAIVideoConfig.transform_video_status_retrieve_responseerror_messagestatus_codec                 C   s   ddl m} ||||d)Nr   r   )rv   messager/   )base_llm.chat.transformationr   )r   ru   rv   r/   r   r    r    r!   get_error_class  s   z!OpenAIVideoConfig.get_error_classrA   rB   rC   c                 C   sF   t |}t|tr|||j||ff dS ||d||ff dS )z<Add an image to the files list with appropriate content typezinput_reference.pngN)r   Zget_image_content_typerm   r   appendname)r   rA   rB   rC   Zimage_content_typer    r    r!   rF     s   

z%OpenAIVideoConfig._add_image_to_files)NNr   )NNNN)-__name__
__module____qualname____doc__r   ri   listr*   r   boolr   r.   r-   r   r   r5   r9   r   r   rG   httpxResponseLiteLLMLoggingObjr   rX   r_   r   ra   bytesrc   rd   intrk   rn   rq   rr   rs   rt   r	   ZHeadersr   ry   r   rF   __classcell__r    r    r   r!   r      s   



/
!

"



$
	
'

)






r   )'ior   typingr   r   r   r   r   r   r	   r
   r   Zhttpx._typesr   r3   Z+litellm.llms.base_llm.videos.transformationr   Z-litellm.llms.openai.image_edit.transformationr   Zlitellm.secret_managers.mainr   Zlitellm.types.llms.openair   Zlitellm.types.routerr   Zlitellm.types.videos.mainr   r   Zlitellm.types.videos.utilsr   r   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjrx   r   Z_BaseLLMExceptionr   r   r    r    r    r!   <module>   s(    (