Ë
    uPêj¡R  ã                   ó*  — d dl Z d dl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mZmZmZ d d	lmZ d d
lmZmZ d dlmZmZ erd dlmZ  ddl!m"Z# e Z$e#Z"neZ$eZ"de%e&e&f   fd„Z'de%e&ef   de&dz  fd„Z( G d„ de«      Z)y)é    N)ÚTYPE_CHECKINGÚAnyÚFinal)ÚRequestFiles)Ú%DEFAULT_GOOGLE_VIDEO_DURATION_SECONDS)ÚImageEditRequestUtils)ÚBaseVideoConfig)Úget_secret_str)Ú"GeminiLongRunningOperationResponseÚGeminiVideoGenerationInstanceÚGeminiVideoGenerationParametersÚGeminiVideoGenerationRequest)ÚGenericLiteLLMParams)Ú VideoCreateOptionalRequestParamsÚVideoObject)Úencode_video_id_with_providerÚextract_original_video_id)ÚLoggingé   )ÚBaseLLMExceptionÚreturnc                 óØ   — t        j                  | «      }t        | d«      r| j                  d«       | j	                  «       }t        j                  |«      j                  d«      }||dœS )zò
    Convert image file to Gemini format with base64 encoding and MIME type.

    Args:
        image_file: File-like object opened in binary mode (e.g., open("path", "rb"))

    Returns:
        Dict with bytesBase64Encoded and mimeType
    Úseekr   zutf-8)ÚbytesBase64EncodedÚmimeType)r   Úget_image_content_typeÚhasattrr   ÚreadÚbase64Ú	b64encodeÚdecode)Ú
image_fileÚ	mime_typeÚimage_bytesÚbase64_encodeds       ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/gemini/videos/transformation.pyÚ_convert_image_to_gemini_formatr'   %   s\   € ô -×CÑCÀJÓO€Iäˆz˜6Ô"Ø�‰˜ÔØ#Ÿ™Ó*€KÜ"×,Ñ,¨[Ó9×@Ñ@ÀÓI€Nà"0¸iÑHÐHó    Ú
parametersc                 ó‚   — | j                  d«      }|�|dk(  ryt        |«      j                  «       j                  «       S )zDNormalize Veo ``parameters.resolution`` for usage and cost tracking.Ú
resolutionNÚ )ÚgetÚstrÚstripÚlower)r)   Úress     r&   Ú'_usage_video_resolution_from_parametersr2   9   s:   € ð —‘ Ó-€CØ
€{�c˜R’iØÜˆs‹8�>‰>Ó×!Ñ!Ó#Ð#r(   c                   óø  ‡ — e Zd ZU dZdddddœZeeef   ed<   ˆ fd„Zdede	fd	„Z
d
edededeeef   fd„Zdededz  fd„Zdededz  fd„Z	 	 d;dedededz  dedz  def
d„Zdededz  dedefd„Zdededededededeeeef   fd„Z	 	 d;dedej0                  dededz  dedz  defd„Zdededededeeef   f
d „Z	 d<dej0                  dededz  defd!„Z	 d<dedededed"edz  deeef   fd#„Zdej0                  dedefd$„Z 	 d<dededededed%eeef   dz  deeef   fd&„Z!	 d<dej0                  dededz  defd'„Z"	 	 	 	 d=dededed(edz  d)e#dz  d*edz  d+eeef   dz  deeef   fd,„Z$	 d<dej0                  dededz  deeef   fd-„Z%dededededeeef   f
d.„Z&dej0                  dedefd/„Z'd0„ Z(d1„ Z)d2„ Z*d3„ Z+	 	 	 d>d4„Z,	 	 d;d5„Z-	 d<d6„Z.d<d7„Z/d8ed9e#deej`                  z  de1fd:„Z2ˆ xZ3S )?ÚGeminiVideoConfiga  
    Configuration class for Gemini (Veo) video generation.

    Veo uses a long-running operation model:
    1. POST to :predictLongRunning returns operation name
    2. Poll operation until done=true
    3. Extract video URI from response
    4. Download video using file API
    ú16:9z9:16)Ú1280x720Ú	1920x1080Ú720x1280Ú	1080x1920Ú"_OPENAI_VIDEO_SIZE_TO_ASPECT_RATIOc                 ó"   •— t         ‰| �  «        y ©N)ÚsuperÚ__init__)ÚselfÚ	__class__s    €r&   r>   zGeminiVideoConfig.__init__U   s   ø€ Ü‰ÑÕr(   Úmodelr   c                 ó
   — g d¢S )z“
        Get the list of supported OpenAI parameters for Veo video generation.
        Veo supports minimal parameters compared to OpenAI.
        )rA   ÚpromptÚinput_referenceÚsecondsÚsize© )r?   rA   s     r&   Úget_supported_openai_paramsz-GeminiVideoConfig.get_supported_openai_paramsX   s   € ò
 IÐHr(   Úvideo_create_optional_paramsÚdrop_paramsc                 óâ  — i }| j                  |«      }|D �ch c]	  }|dvsŒ|’Œ }}d|v r|d   |d<   d|v rH|d   }|�A| j                  |«      }	|	r|	|d<   |j                  d«      s| j                  |«      }
|
�|
|d<   d|v r*|d   }	 t	        |t
        «      rt        |«      n|}|�||d<   |j                  «       D ]  \  }}||vsŒ||vsŒ|||<   Œ |S c c}w # t        t        f$ r Y Œ?w xY w)	u  
        Map OpenAI-style parameters to Veo format.

        Mappings:
        - prompt â†’ prompt
        - input_reference â†’ image
        - size â†’ aspectRatio (e.g., "1280x720" â†’ "16:9")
        - size â†’ resolution when inferable ("1280x720"/"720x1280" â†’ "720p",
          "1920x1080"/"1080x1920" â†’ "1080p"); skipped if ``resolution`` is already set
        - seconds â†’ durationSeconds (defaults to 4 seconds if not provided)

        All other params are passed through as-is to support Gemini-specific parameters.
        >   rA   rC   rD   ÚimagerF   ÚaspectRatior+   rE   ÚdurationSeconds)
rH   Ú_convert_size_to_aspect_ratior-   Ú_convert_size_to_resolutionÚ
isinstancer.   ÚintÚ
ValueErrorÚ	TypeErrorÚitems)r?   rI   rA   rJ   Úmapped_paramsÚsupported_openai_paramsÚparamÚopenai_params_to_maprF   Úaspect_ratioÚinferred_resolutionrE   ÚdurationÚkeyÚvalues                  r&   Úmap_openai_paramsz#GeminiVideoConfig.map_openai_params_   s\  € ð& 02ˆð *.×)IÑ)IÈ%Ó)PÐØ:QÖ&v°ÐUZÐbuÒUu¢uÐ&vÐÐ&vð Ð <Ñ<Ø%AÐBSÑ%TˆM˜'Ñ"ð Ð1Ñ1Ø6°vÑ>ˆDØÐØ&*×&HÑ&HÈÓ&N�ÙØ3?�M -Ñ0Ø3×7Ñ7¸ÔEØ15×1QÑ1QÐRVÓ1WÐ'Ø*Ð6Ø6I˜ lÑ3ð Ð4Ñ4Ø9¸)ÑDˆGðÜ2<¸WÄcÔ2J¤# g¤,ÐPW�ØÐ'Ø7?�MÐ"3Ñ4ð 7×<Ñ<Ó>ò 	+‰JˆC�ØÐ.Ò.°3¸mÒ3KØ%*�˜cÒ"ð	+ð ÐùòE 'wøô2 ¤	Ð*ò áðús   ˜	C¢CÂ
$C ÃC.Ã-C.rF   Nc                 ó@   — |sy| j                   j                  |d«      S )zà
        Convert OpenAI size format to Veo aspectRatio format.

        https://cloud.google.com/vertex-ai/generative-ai/docs/image/generate-videos

        Supported aspect ratios: 9:16 (portrait), 16:9 (landscape)
        Nr5   )r:   r-   )r?   rF   s     r&   rO   z/GeminiVideoConfig._convert_size_to_aspect_ratioš   s#   € ñ Øà×6Ñ6×:Ñ:¸4ÀÓHÐHr(   c                 óÐ   — |r|| j                   vry	 |j                  dd«      \  }}t        t        |«      t        |«      «      }|dk(  ry|dk(  ryy# t        t
        f$ r Y yw xY w)zû
        Map OpenAI ``size`` (WxH) to Veo ``resolution`` for presets in
        ``_OPENAI_VIDEO_SIZE_TO_ASPECT_RATIO`` (720p / 1080p from the smaller edge).

        Unknown sizes return None so the API default applies (no forced resolution).
        NÚxé   iÐ  Ú720pi8  Ú1080p)r:   ÚsplitÚminrR   rS   rT   )r?   rF   Úw_strÚh_strÚsmallers        r&   rP   z-GeminiVideoConfig._convert_size_to_resolution§   sv   € ñ �t 4×#JÑ#JÑJØð	ØŸ:™: c¨1Ó-‰LˆE�5Ü ¤ U£¬S°«ZÓ8ˆGð �cŠ>ØØ�dŠ?ØØøô œIÐ&ò 	Ùð	ús   “3A ÁA%Á$A%ÚheadersÚapi_keyÚlitellm_paramsc                 óà   — |r|j                   r|xs |j                   }|xs* t        j                   xs t        d«      xs t        d«      }|st        d«      ‚|j	                  |ddœ«       |S )z‡
        Validate environment and add Gemini API key to headers.
        Gemini uses x-goog-api-key header for authentication.
        ÚGOOGLE_API_KEYÚGEMINI_API_KEYz‡GEMINI_API_KEY or GOOGLE_API_KEY is required for Veo video generation. Set it via environment variable or pass it as api_key parameter.zapplication/json)zx-goog-api-keyzContent-Type)rl   Úlitellmr
   rS   Úupdate)r?   rk   rA   rl   rm   s        r&   Úvalidate_environmentz&GeminiVideoConfig.validate_environment»   sz   € ñ ˜n×4Ò4ØÒ7 ×!7Ñ!7ˆGàÒtœWŸ_™_Òt´Ð?OÓ0PÒtÔTbÐcsÓTtˆáÜðSóð ð
 	�‰à")Ø 2ñô	
ð ˆr(   Úapi_basec                 óª   — |€t        d«      xs d}|r|dk(  r|j                  d«      S |j                  dd«      }|j                  d«      › d|› d�}|S )z·
        Get the complete URL for Veo video generation.
        For video creation: returns full URL with :predictLongRunning
        For status/delete: returns base URL only
        ÚGEMINI_API_BASEz)https://generativelanguage.googleapis.comr,   ú/zgemini/z/v1beta/models/z:predictLongRunning)r
   ÚrstripÚreplace)r?   rA   rt   rm   Ú
model_nameÚurls         r&   Úget_complete_urlz"GeminiVideoConfig.get_complete_urlÚ   se   € ð ÐÜ%Ð&7Ó8ÒgÐ<gˆHá˜ šØ—?‘? 3Ó'Ð'à!ŸM™M¨)°RÓ8ˆ
Ø Ÿ™¨Ó,Ð-¨_¸Z¸LÐH[Ð\ˆàˆ
r(   rC   Ú$video_create_optional_request_paramsc                 óþ   — d|i}|j                  «       }d|v r6|j                  d«      }	|	�#t        |	t        «      r|	}
nt	        |	«      }
|
|d<   t        di |¤Ž}t        |g|¬«      }|j                  d¬«      }|g |fS )a5  
        Transform the video creation request for Veo API.

        Veo expects:
        {
            "instances": [
                {
                    "prompt": "A cat playing with a ball of yarn",
                    "image": {
                        "bytesBase64Encoded": "...",
                        "mimeType": "image/jpeg"
                    }
                }
            ],
            "parameters": {
                "aspectRatio": "16:9",
                "durationSeconds": 8,
                "resolution": "720p"
            }
        }
        rC   rL   )Ú	instancesr)   T)Úexclude_nonerG   )ÚcopyÚpoprQ   Údictr'   r   r   Ú
model_dump)r?   rA   rC   rt   r}   rm   rk   ÚinstanceÚparams_copyrL   Ú
image_datar)   Úrequest_body_objÚrequest_datas                 r&   Útransform_video_create_requestz0GeminiVideoConfig.transform_video_create_requestð   s™   € ð< ;CÀFÐ9KˆàA×FÑFÓHˆà�kÑ!Ø&Ÿ?™?¨7Ó3ˆEØÐ Ü˜e¤TÔ*Ø!&‘Jä!@ÀÓ!G�JØ$.�˜Ñ!ä;ÑJ¸kÑJˆ
ä">È(ÈÐ`jÔ"kÐà.×9Ñ9ÀtÐ9ÓLˆà˜R Ð)Ð)r(   Úraw_responseÚlogging_objÚcustom_llm_providerr‰   c                 óÒ  — |j                  «       }	 t        di |¤Ž}|j                  }	|	st        d|› �«      ‚|rt        |	||«      }
n|	}
t        |
dd|¬«      }i }|rN|j                  di «      }|j                  d«      xs t        }|�	 t        |«      |d	<   t        |«      }|�||d
<   ||_        |S # t        $ r}t        d|› �«      ‚d}~ww xY w# t        t        f$ r Y ŒKw xY w)aÍ  
        Transform the Veo video creation response.

        Veo returns:
        {
            "name": "operations/generate_1234567890",
            "metadata": {...},
            "done": false,
            "error": {...}
        }

        We return this as a VideoObject with:
        - id: operation name (used for polling)
        - status: "processing"
        - usage: includes duration_seconds and optional video_resolution for cost calculation
        z$Failed to parse operation response: Nz#No operation name in Veo response: ÚvideoÚ
processing)ÚidÚobjectÚstatusrA   r)   rN   Úduration_secondsÚvideo_resolutionrG   )Újsonr   Ú	ExceptionrS   Únamer   r   r-   r   ÚfloatrT   r2   Úusage)r?   rA   r‹   rŒ   r�   r‰   Úresponse_dataÚoperation_responseÚeÚoperation_nameÚvideo_idÚ	video_objÚ
usage_datar)   r\   r•   s                   r&   Útransform_video_create_responsez1GeminiVideoConfig.transform_video_create_response#  s.  € ð0  ,×0Ñ0Ó2ˆð	IÜ(JÑ([È]Ñ([Ðð !3× 7Ñ 7ˆÙÜÐBÀ=À/ÐRÓSÐSáÜ4°^ÐEXÐZ_Ó`‰Hà%ˆHä&ØØØØô	
ˆ	ð -/ˆ
ÙØ ,× 0Ñ 0°¸rÓ BˆJØ(Ÿn™nÐ->Ó?ÒhÔChˆHØÐ#ðÜ5:¸8³_�JÐ1Ñ2ô 'NÈjÓ&YÐØÐ+Ø1A�
Ð-Ñ.à$ˆ	ŒØÐøôC ò 	IÜÐCÀAÀ3ÐGÓHÐHûð	Iûô4 #¤IÐ.ò Ùðús)   ’B5 ÂC Â5	CÂ>CÃCÃC&Ã%C&rŸ   c                 óP   — t        |«      }|j                  d«      › d|› �}i }||fS )zº
        Transform the video status retrieve request for Veo API.

        Veo polls operations at:
        GET https://generativelanguage.googleapis.com/v1beta/{operation_name}
        rw   ú/v1beta/)r   rx   )r?   rŸ   rt   rm   rk   rž   r{   Úparamss           r&   Ú'transform_video_status_retrieve_requestz9GeminiVideoConfig.transform_video_status_retrieve_requestc  s8   € ô !:¸(Ó CˆØ Ÿ™¨Ó,Ð-¨X°nÐ5EÐFˆØ(*ˆà�Fˆ{Ðr(   c                 ó´   — |j                  «       }t        di |¤Ž}|j                  }|j                  }|rt	        ||d«      }n|}t        |d|sdnd¬«      }	|	S )a¥  
        Transform the Veo operation status response.

        Veo returns:
        {
            "name": "operations/generate_1234567890",
            "done": false  # or true when complete
        }

        When done=true:
        {
            "name": "operations/generate_1234567890",
            "done": true,
            "response": {
                "generateVideoResponse": {
                    "generatedSamples": [
                        {
                            "video": {
                                "uri": "files/abc123..."
                            }
                        }
                    ]
                }
            }
        }
        Nr�   r�   Ú	completed)r‘   r’   r“   rG   )r–   r   r˜   Údoner   r   )
r?   r‹   rŒ   r�   r›   rœ   rž   Úis_donerŸ   r    s
             r&   Ú(transform_video_status_retrieve_responsez:GeminiVideoConfig.transform_video_status_retrieve_responsev  sn   € ð@  ,×0Ñ0Ó2ˆä$FÑ$WÈÑ$WÐà 2× 7Ñ 7ˆØ+×0Ñ0ˆáÜ4°^ÐEXÐZ^Ó_‰Hà%ˆHä&ØØÙ'.‘<°Kô
ˆ	ð
 Ðr(   Úvariantc                 óº  — t        |«      }|j                  d«      › d|› �}t        j                  }|j	                  ||¬«      }	|	j                  «        |	j                  «       }
t        di |
¤Ž}|j                  st        d«      ‚|j                  st        d«      ‚|j                  j                  j                  }|d   j                  j                  }i }||fS )zÂ
        Transform the video content request for Veo API.

        For Veo, we need to:
        1. Get operation status to extract video URI
        2. Return download URL for the video
        rw   r¤   )r{   rk   zaVideo generation is not complete yet. Please check status with video_status() before downloading.z'No response data in completed operationr   rG   )r   rx   rq   Úmodule_level_clientr-   Úraise_for_statusr–   r   r©   rS   ÚresponseÚgenerateVideoResponseÚgeneratedSamplesr�   Úuri)r?   rŸ   rt   rm   rk   r¬   rž   Ú
status_urlÚclientÚstatus_responser›   rœ   Úgenerated_samplesÚdownload_urlr¥   s                  r&   Útransform_video_content_requestz1GeminiVideoConfig.transform_video_content_request©  sÜ   € ô !:¸(Ó Cˆà'Ÿ™¨sÓ3Ð4°H¸^Ð<LÐMˆ
Ü×3Ñ3ˆØ!'§¡°
ÀG Ó!LˆØ×(Ñ(Ô*Ø.×3Ñ3Ó5ˆä$FÑ$WÈÑ$WÐà!×&Ò&ÜØsóð ð "×*Ò*ÜÐFÓGÐGà#5×#>Ñ#>×#TÑ#T×#eÑ#eÐØ/°Ñ2×8Ñ8×<Ñ<ˆà(*ˆà˜VÐ#Ð#r(   c                 ó   — |j                   S )zn
        Transform the Veo video content download response.
        Returns the video bytes directly.
        )Úcontent©r?   r‹   rŒ   s      r&   Ú transform_video_content_responsez2GeminiVideoConfig.transform_video_content_responseÑ  s   € ð ×#Ñ#Ð#r(   Ú
extra_bodyc                 ó   — t        d«      ‚)z:
        Video remix is not supported by Veo API.
        z_Video remix is not supported by Google Veo. Please use video_generation() to create new videos.©ÚNotImplementedError)r?   rŸ   rC   rt   rm   rk   r¾   s          r&   Útransform_video_remix_requestz/GeminiVideoConfig.transform_video_remix_requestÜ  s   € ô "Ømó
ð 	
r(   c                 ó   — t        d«      ‚)zVideo remix is not supported.z+Video remix is not supported by Google Veo.rÀ   ©r?   r‹   rŒ   r�   s       r&   Útransform_video_remix_responsez0GeminiVideoConfig.transform_video_remix_responseì  s   € ô "Ð"OÓPÐPr(   ÚafterÚlimitÚorderÚextra_queryc                 ó   — t        d«      ‚)z9
        Video list is not supported by Veo API.
        zoVideo list is not supported by Google Veo. Use the operations endpoint directly if you need to list operations.rÀ   )r?   rt   rm   rk   rÆ   rÇ   rÈ   rÉ   s           r&   Útransform_video_list_requestz.GeminiVideoConfig.transform_video_list_requestõ  s   € ô "ðSó
ð 	
r(   c                 ó   — t        d«      ‚)zVideo list is not supported.z*Video list is not supported by Google Veo.rÀ   rÄ   s       r&   Útransform_video_list_responsez/GeminiVideoConfig.transform_video_list_response  s   € ô "Ð"NÓOÐOr(   c                 ó   — t        d«      ‚)z;
        Video delete is not supported by Veo API.
        z[Video delete is not supported by Google Veo. Videos are automatically cleaned up by Google.rÀ   )r?   rŸ   rt   rm   rk   s        r&   Útransform_video_delete_requestz0GeminiVideoConfig.transform_video_delete_request  s   € ô "Øió
ð 	
r(   c                 ó   — t        d«      ‚)zVideo delete is not supported.z,Video delete is not supported by Google Veo.rÀ   r¼   s      r&   Útransform_video_delete_responsez1GeminiVideoConfig.transform_video_delete_response  s   € ô "Ð"PÓQÐQr(   c                 ó   — t        d«      ‚©Nz2video create character is not supported for GeminirÀ   )r?   r˜   r�   rt   rm   rk   s         r&   Ú(transform_video_create_character_requestz:GeminiVideoConfig.transform_video_create_character_request&  ó   € Ü!Ð"VÓWÐWr(   c                 ó   — t        d«      ‚rÓ   rÀ   r¼   s      r&   Ú)transform_video_create_character_responsez;GeminiVideoConfig.transform_video_create_character_response)  rÕ   r(   c                 ó   — t        d«      ‚©Nz/video get character is not supported for GeminirÀ   )r?   Úcharacter_idrt   rm   rk   s        r&   Ú%transform_video_get_character_requestz7GeminiVideoConfig.transform_video_get_character_request,  ó   € Ü!Ð"SÓTÐTr(   c                 ó   — t        d«      ‚rÙ   rÀ   r¼   s      r&   Ú&transform_video_get_character_responsez8GeminiVideoConfig.transform_video_get_character_response/  rÜ   r(   c	                 ó   — t        d«      ‚©Nz&video edit is not supported for GeminirÀ   )	r?   rC   rŸ   rt   rm   rk   Ú
video_filer¾   Úprefetched_source_datas	            r&   Útransform_video_edit_requestz.GeminiVideoConfig.transform_video_edit_request2  s   € ô "Ð"JÓKÐKr(   c                 ó   — t        d«      ‚rà   rÀ   )r?   r‹   rŒ   r�   r‰   s        r&   Útransform_video_edit_responsez/GeminiVideoConfig.transform_video_edit_response?  s   € ô "Ð"JÓKÐKr(   c                 ó   — t        d«      ‚©Nz+video extension is not supported for GeminirÀ   )r?   rC   rŸ   rE   rt   rm   rk   r¾   s           r&   Ú!transform_video_extension_requestz3GeminiVideoConfig.transform_video_extension_requestH  s   € ô "Ð"OÓPÐPr(   c                 ó   — t        d«      ‚rç   rÀ   rÄ   s       r&   Ú"transform_video_extension_responsez4GeminiVideoConfig.transform_video_extension_responseT  s   € Ü!Ð"OÓPÐPr(   Úerror_messageÚstatus_codec                 ó$   — ddl m}  ||||¬«      S )Né   )ÚGeminiError)rì   Úmessagerk   )Úcommon_utilsrï   )r?   rë   rì   rk   rï   s        r&   Úget_error_classz!GeminiVideoConfig.get_error_classW  s   € Ý.áØ#Ø!Øô
ð 	
r(   )NNr<   )NNNN)NNN)4Ú__name__Ú
__module__Ú__qualname__Ú__doc__r:   rƒ   r.   Ú__annotations__r>   ÚlistrH   r   Úboolr   r_   rO   rP   r   rs   r|   Útupler   rŠ   ÚhttpxÚResponseÚLiteLLMLoggingObjr   r¢   r¦   r«   r¹   Úbytesr½   rÂ   rÅ   rR   rË   rÍ   rÏ   rÑ   rÔ   r×   rÛ   rÞ   rã   rå   rè   rê   ÚHeadersr   rò   Ú__classcell__)r@   s   @r&   r4   r4   C   s   ø… ñð ØØØñ	:Ð&¨¨S°#¨X©ó ôðI°ð I¸ó Ið9à&Fð9ð ð9ð ð	9ð
 
ˆc�3ˆh‰ó9ðvI°#ð I¸#À¹*ó Ið°ð ¸¸d¹
ó ð0 #Ø6:ñàðð ðð �t‘ð	ð
 -¨tÑ3ðð 
óð>àðð ˜‘*ðð ð	ð
 
óð,1*àð1*ð ð1*ð ð	1*ð
 /3ð1*ð -ð1*ð ð1*ð 
ˆt�\ 3Ð&Ñ	'ó1*ðp +/Ø$(ñ>àð>ð —n‘nð>ð 'ð	>ð
 ! 4™Zð>ð ˜T‘kð>ð 
ó>ð@àðð ðð -ð	ð
 ðð 
ˆs�DˆyÑ	óð. +/ñ	1à—n‘nð1ð 'ð1ð ! 4™Zð	1ð
 
ó1ðr #ñ&$àð&$ð ð&$ð -ð	&$ð
 ð&$ð �t‘ð&$ð 
ˆs�DˆyÑ	ó&$ðP	$à—n‘nð	$ð 'ð	$ð 
ó		$ð$ -1ñ
àð
ð ð
ð ð	
ð
 -ð
ð ð
ð ˜˜c˜‘N TÑ)ð
ð 
ˆs�DˆyÑ	ó
ð( +/ñ	Qà—n‘nðQð 'ðQð ! 4™Zð	Qð
 
óQð !Ø Ø Ø-1ñ
àð
ð -ð
ð ð	
ð
 �T‰zð
ð �T‰zð
ð �T‰zð
ð ˜#˜s˜(‘^ dÑ*ð
ð 
ˆs�DˆyÑ	ó
ð, +/ñ	Pà—n‘nðPð 'ðPð ! 4™Zð	Pð
 
ˆc�3ˆh‰óPð
àð
ð ð
ð -ð	
ð
 ð
ð 
ˆs�DˆyÑ	ó
ðRà—n‘nðRð 'ðRð 
ó	RòXòXòUòUð ØØ#óLð" !ØóLð" ó
QóQð
¨Sð 
¸sð 
ÈTÐTY×TaÑTaÑMað 
Ðfv÷ 
r(   r4   )*r   Útypingr   r   r   rû   Úhttpx._typesr   rq   Úlitellm.constantsr   Úlitellm.images.utilsr   Ú+litellm.llms.base_llm.videos.transformationr	   Úlitellm.secret_managers.mainr
   Úlitellm.types.llms.geminir   r   r   r   Úlitellm.types.routerr   Úlitellm.types.videos.mainr   r   Úlitellm.types.videos.utilsr   r   Ú*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjÚbase_llm.chat.transformationr   Ú_BaseLLMExceptionrý   rƒ   r.   r'   r2   r4   rG   r(   r&   ú<module>r     s¢   ðÛ ß ,Ñ ,ã Ý %ã Ý CÝ 6Ý GÝ 7÷ó õ 6ß S÷ñ
 ÝXåUà*ÐØ(ÑàÐØÐðI°4¸¸S¸±>ó Ið($Ø�S˜#�X‘ð$àˆ4�Zó$ô[
˜õ [
r(   