Ë
    uPêjRz  ã                   ó  — d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZ ddlZddlmZm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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	rddl)m*Z+ ddl,m-Z. e+Z/e.Z-ne
Z/e
Z- G d„ ded¬«      Z0 G d„ ded¬«      Z1 G d„ ded¬«      Z2 G d„ ded¬«      Z3dejh                  de3fd„Z5de6e7e
f   dz  de6e7e8e7z  f   fd „Z9de6e7e7f   fd!„Z: G d"„ d#ee «      Z;y)$zí
Vertex AI Video Generation Transformation

Handles transformation of requests/responses for Vertex AI's Veo video generation API.
Based on: https://docs.cloud.google.com/vertex-ai/generative-ai/docs/model-reference/veo-video-generation
é    N)ÚMappingÚSequence)ÚMappingProxyType)ÚTYPE_CHECKINGÚAnyÚClassVarÚFinalÚ	TypedDictÚcast)ÚFileContentÚRequestFiles)ÚReadOnly)Ú%DEFAULT_GOOGLE_VIDEO_DURATION_SECONDS)ÚImageEditRequestUtils)ÚBaseVideoConfig)Ú+_convert_vertex_datetime_to_openai_datetimeÚget_vertex_base_url)Ú
VertexBase)ÚGenericLiteLLMParams)Ú VideoCreateOptionalRequestParamsÚVideoObject)Úencode_video_id_with_providerÚextract_original_video_id)ÚLogging)ÚBaseLLMExceptionc                   ó>   — e Zd ZU ee   ed<   ee   ed<   ee   ed<   y)Ú	_VeoVideoÚgcsUriÚbytesBase64EncodedÚmimeTypeN©Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚ__annotations__© ó    úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/videos/transformation.pyr   r   /   s    … Ø�S‰MÓØ  ™Ó%Ø�s‰mÔr(   r   F)Útotalc                   ó$   — e Zd ZU eee      ed<   y)Ú_VeoOperationResponseÚvideosN)r"   r#   r$   r   r   r   r&   r'   r(   r)   r,   r,   5   s   … Ø�X˜iÑ(Ñ)Ô)r(   r,   c                   ó   — e Zd ZU ee   ed<   y)Ú_VeoOperationMetadataÚ
createTimeNr!   r'   r(   r)   r/   r/   9   s   … Ø˜‘Ôr(   r/   c                   óN   — e Zd ZU ee   ed<   ee   ed<   ee   ed<   ee   ed<   y)Ú_VeoOperationÚnameÚdoneÚmetadataÚresponseN)	r"   r#   r$   r   r%   r&   Úboolr/   r,   r'   r(   r)   r2   r2   =   s.   … Ø
�3‰-ÓØ
�4‰.ÓØÐ,Ñ-Ó-ØÐ,Ñ-Ô-r(   r2   Úraw_responseÚreturnc                 ó&   — | j                  «       }|S ©N)Újson)r8   Ú	operations     r)   Ú_parse_veo_operationr>   D   s   € Ø&2×&7Ñ&7Ó&9€IØÐr(   Úrequest_datac                 óf  — i }| s|S | j                  di «      }|j                  d«      xs t        }|�	 t        |«      |d<   |j                  d«      }|�Ft        |«      j                  «       dk7  r*t        |«      j                  «       j                  «       |d<   |S # t        t        f$ r Y Œlw xY w)zGBuild usage metadata (duration, resolution) for video cost calculation.Ú
parametersÚdurationSecondsÚduration_secondsÚ
resolutionÚ Úvideo_resolution)Úgetr   ÚfloatÚ
ValueErrorÚ	TypeErrorr%   ÚstripÚlower)r?   Ú
usage_datarA   ÚdurationÚress        r)   Ú+_build_vertex_video_usage_from_request_datarP   I   s¸   € ð 13€JÙØÐà$×(Ñ(¨°rÓ:€JØ —n‘nÐ%6Ó7Ò`Ô;`€HØÐð	Ü-2°8«_ˆJÐ)Ñ*ð —‘ Ó-€CØ
€œ3˜s›8Ÿ>™>Ó+¨rÒ1Ü),¨S«¯©Ó)9×)?Ñ)?Ó)Aˆ
Ð%Ñ&ØÐøô œIÐ&ò 	Ùð	ús   µB ÂB0Â/B0c                 óØ   — t        j                  | «      }t        | d«      r| j                  d«       | j	                  «       }t        j                  |«      j                  d«      }||dœS )zõ
    Convert image file to Vertex AI 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)r   r    )r   Úget_image_content_typeÚhasattrrR   ÚreadÚbase64Ú	b64encodeÚdecode)Ú
image_fileÚ	mime_typeÚimage_bytesÚbase64_encodeds       r)   Ú_convert_image_to_vertex_formatr]   ^   s\   € ô -×CÑCÀJÓO€Iäˆz˜6Ô"Ø�‰˜ÔØ#Ÿ™Ó*€KÜ"×,Ñ,¨[Ó9×@Ñ@ÀÓI€Nà"0¸iÑHÐHr(   c                   ó<  — e Zd ZU dZ edddddœ«      Zeeeef      e	d<    edddddœ«      Z
eeeef      e	d<   d	„ Zed
ededz  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ededefd„«       Z	 	 dEdedededz  deez  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	 	 dEded ej>                  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#	 dFd ej>                  d!e d"edz  de!fd'„Z$	 dFd%edededed(edz  deeef   fd)„Z%d ej>                  d!e de&fd*„Z'	 dFd%ededededed+eeef   dz  deeef   fd,„Z(	 dFd ej>                  d!e d"edz  de!fd-„Z)	 	 	 	 dGdededed.edz  d/e*dz  d0edz  d1eeef   dz  deeef   fd2„Z+	 dFd ej>                  d!e d"edz  deeef   fd3„Z,d%ededededeeef   f
d4„Z-d ej>                  d!e de!fd5„Z.d6efd7„Z/d8„ Z0d9„ Z1d:„ Z2d%ededededeeef   f
d;„Z3	 	 	 dHded%edededed<e4dz  d+eeef   dz  d=eee5f   dz  deeeeef   edz  f   fd>„Z6	 	 dEd ej>                  d!e d"edz  d#edz  de!f
d?„Z7	 dFd@„Z8dFdA„Z9dBedCe*deejt                  z  de;fdD„Z<y)IÚVertexAIVideoConfiga  
    Configuration class for Vertex AI (Veo) video generation.

    Veo uses a long-running operation model:
    1. POST to :predictLongRunning returns operation name
    2. Poll operation using :fetchPredictOperation until done=true
    3. Extract video data (base64) from response
    ú16:9z9:16)Ú1280x720Ú	1920x1080Ú720x1280Ú	1080x1920Ú"_OPENAI_VIDEO_SIZE_TO_ASPECT_RATIOÚ720pÚ1080pÚ _OPENAI_VIDEO_SIZE_TO_RESOLUTIONc                 óX   — t        j                  | «       t        j                  | «       y r;   )r   Ú__init__r   )Úselfs    r)   rj   zVertexAIVideoConfig.__init__�   s   € Ü× Ñ  Ô&Ü×Ñ˜DÕ!r(   Úoperation_namer9   Nc                 óL   — | j                  d«      }t        |«      dk\  r|d   S y)a]  
        Extract the model name from a Vertex AI operation name.

        Args:
            operation_name: Operation name in format:
                projects/PROJECT/locations/LOCATION/publishers/google/models/MODEL/operations/OPERATION_ID

        Returns:
            Model name (e.g., "veo-2.0-generate-001") or None if extraction fails
        ú/é   é   N)ÚsplitÚlen)rl   Úpartss     r)   Ú!extract_model_from_operation_namez5VertexAIVideoConfig.extract_model_from_operation_name‘   s+   € ð &×+Ñ+¨CÓ0ˆäˆu‹:˜Š?Ø˜‘8ˆOØr(   Úmodelc                 ó
   — g d¢S )z“
        Get the list of supported OpenAI parameters for Veo video generation.
        Veo supports minimal parameters compared to OpenAI.
        )ru   ÚpromptÚinput_referenceÚsecondsÚsizer'   )rk   ru   s     r)   Úget_supported_openai_paramsz/VertexAIVideoConfig.get_supported_openai_params£   s   € ò
 IÐHr(   Úvideo_create_optional_paramsÚdrop_paramsc                 ó  — i }d|v r	|d   |d<   nd|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   d|v rˆ|d   }|��| j                  |«      }|r||d<   |j                  d«      }d|v xs% t        |t        «      xr |j                  d«      du}| j	                  |«      }	|	r|s| j                  |«      }
|
�|
|d<   d|v r,|d   }	 t        |t        «      rt        |«      n|}|�||d	<   |S |S # t        t        f$ r Y |S w xY w)
u  
        Map OpenAI-style parameters to Veo format.

        Mappings:
        - prompt â†’ prompt (in instances)
        - input_reference â†’ image (in instances)
        - size â†’ aspectRatio (e.g., "1280x720" â†’ "16:9")
        - size â†’ resolution for models with resolution-tier pricing when inferable
          ("1280x720"/"720x1280" â†’ "720p", "1920x1080"/"1080x1920" â†’ "1080p");
          skipped if ``resolution`` is already set
        - seconds â†’ durationSeconds (defaults to 4 seconds if not provided)
        rx   ÚimagerA   rD   rz   NÚaspectRatiory   rB   )
Ú_convert_size_to_aspect_ratiorG   Ú
isinstanceÚdictÚ_supports_resolution_inferenceÚ_convert_size_to_resolutionr%   ÚintrI   rJ   )rk   r|   ru   r}   Úmapped_paramsrz   Úaspect_ratioÚnested_paramsÚhas_resolutionÚsupports_resolutionÚinferred_resolutionry   rN   s                r)   Úmap_openai_paramsz%VertexAIVideoConfig.map_openai_paramsª   s�  € ð$ 35ˆð Ð <Ñ<Ø%AÐBSÑ%TˆM˜'Ò"ØÐ4Ñ4Ø%AÀ'Ñ%JˆM˜'Ñ"ð Ð7Ñ7Ø*FÀ|Ñ*TˆM˜,Ñ'àÐ7Ñ7Ø*FÀ|Ñ*TˆM˜,Ñ'ð Ð1Ñ1Ø6°vÑ>ˆDØÐØ&*×&HÑ&HÈÓ&N�ÙØ3?�M -Ñ0Ø'C×'GÑ'GÈÓ'U�Ø!-°Ð!>ò "Ü˜}¬dÓ3Òc¸×8IÑ8IÈ,Ó8WÐ_cÐ8cð ð '+×&IÑ&IÈ%Ó&PÐ#Ù&©~Ø*.×*JÑ*JÈ4Ó*PÐ'Ø*Ð6Ø6I˜ lÑ3ð Ð4Ñ4Ø9¸)ÑDˆGðÜ2<¸WÄcÔ2J¤# g¤,ÐPW�ØÐ'Ø7?�MÐ"3Ñ4ð
 Ðˆ}Ðøô	 ¤	Ð*ò ààÐð	ús   Ã
$C2 Ã2DÄDrz   c                 ó@   — |sy| j                   j                  |d«      S )z‹
        Convert OpenAI size format to Veo aspectRatio format.

        Supported aspect ratios: 9:16 (portrait), 16:9 (landscape)
        Nr`   )re   rG   ©rk   rz   s     r)   r�   z1VertexAIVideoConfig._convert_size_to_aspect_ratioé   s#   € ñ Øà×6Ñ6×:Ñ:¸4ÀÓHÐHr(   c                 ó8   — | j                   j                  |«      S r;   )rh   rG   r�   s     r)   r…   z/VertexAIVideoConfig._convert_size_to_resolutionô   s   € Ø×4Ñ4×8Ñ8¸Ó>Ð>r(   c                 ó¢   — | j                  d«      r| nd| › �}t        j                  j                  |«      }|d uxr |j                  d«      d uS )Nú
vertex_ai/Úoutput_cost_per_second_1080p)Ú
startswithÚlitellmÚ
model_costrG   )ru   Ú	model_keyÚ
model_infos      r)   r„   z2VertexAIVideoConfig._supports_resolution_inference÷   sU   € à$)×$4Ñ$4°\Ô$B™5È*ÐUZÐT[ÐH\ˆ	Ü#×.Ñ.×2Ñ2°9Ó=ˆ
Ø Ð%Òd¨*¯.©.Ð9WÓ*XÐ`dÐ*dÐdr(   ÚheadersÚapi_keyÚlitellm_paramsc                 óà   — |�t        t        t        t        f   |«      ni }t	        j
                  |¬«      }t	        j                  |¬«      }| j                  ||¬«      \  }}	d|› �ddœ|¥}|S )z¤
        Validate environment and return headers for Vertex AI OCR.

        Vertex AI uses Bearer token authentication with access token from credentials.
        )r›   )ÚcredentialsÚ
project_idzBearer zapplication/json)ÚAuthorizationzContent-Type)r   rƒ   r%   r   r   Úsafe_get_vertex_ai_projectÚsafe_get_vertex_ai_credentialsÚget_access_token)
rk   r™   ru   rš   r›   Úparams_dictÚvertex_projectÚvertex_credentialsÚaccess_tokenrž   s
             r)   Úvalidate_environmentz(VertexAIVideoConfig.validate_environmentý   sŽ   € ð VdÐUo¬T´$´s¼C°x±.À.Ô-QÐuwˆä *× EÑ EÐU`Ô aˆÜ$.×$MÑ$MÐ]hÔ$iÐð $(×#8Ñ#8Ø*Ø%ð $9ó $
Ñ ˆ�jð  ' | nÐ5Ø.ñ
ð ð
ˆð ˆr(   Úapi_basec                 óü   — t        j                  |«      }t        j                  |«      }|st        d«      ‚|xs d}|j	                  dd«      }|r|j                  d«      }nt        |«      }|› d|› d|› d|› �}|S )	a  
        Get the complete URL for Veo video generation.

        Returns URL for :predictLongRunning endpoint:
        https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/publishers/google/models/MODEL:predictLongRunning
        z�vertex_project is required for Vertex AI video generation. Set it via environment variable VERTEXAI_PROJECT or pass as parameter.zus-central1r’   rE   rn   z/v1/projects/z/locations/z/publishers/google/models/)r   r    Úsafe_get_vertex_ai_locationrI   ÚreplaceÚrstripr   )	rk   ru   r¨   r›   r¤   Úvertex_locationÚ
model_nameÚbase_urlÚurls	            r)   Úget_complete_urlz$VertexAIVideoConfig.get_complete_url  s¢   € ô !+× EÑ EÀnÓ UˆÜ$×@Ñ@ÀÓPˆáÜðYóð ð *Ò:¨]ˆð "ŸM™M¨,¸Ó;ˆ
ñ Ø—‘ sÓ+‰Hä*¨?Ó;ˆHð ˆj˜ nÐ%5°[ÀÐ@QÐQkÐlvÐkwÐxð 	ð ˆ
r(   rw   Ú$video_create_optional_request_paramsc                 ój  — d|i}|j                  «       }d|v r9t        |d   t        «      r&|j                  |d   «       |j	                  d«       n‡d|v rƒ|d   �~|d   }	t        |	t        «      r|	}
nPt        |	t
        «      r|	j                  d«      rd|	i}
n*t        |	t
        «      rt        d|	› d�«      ‚t        |	«      }
|
|d<   |j	                  d«       |j	                  d	d«      }i }t        |t        «      r|j                  |«       |j                  |«       d|gi}|r||d	<   |› d
�}|g |fS )a  
        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
            }
        }
        rw   Ú	instancesr   Nzgs://r   zUnsupported image value 'zw'. Provide a GCS URI (gs://...), a dict with 'gcsUri' or 'bytesBase64Encoded'/'mimeType', or a binary file-like object.rA   ú:predictLongRunning)	Úcopyr‚   rƒ   ÚupdateÚpopr%   r”   rI   r]   )rk   ru   rw   r¨   r²   r›   r™   Úinstance_dictÚparams_copyr   Ú
image_datar‰   Úvertex_paramsr?   r°   s                  r)   Útransform_video_create_requestz2VertexAIVideoConfig.transform_video_create_requestF  se  € ð< 4<¸VÐ2DˆØA×FÑFÓHˆð ˜+Ñ%¬*°[ÀÑ5MÌtÔ*Tà× Ñ  ¨[Ñ!9Ô:Ø�O‰O˜KÕ(Ø˜Ñ#¨°GÑ(<Ð(HØ& wÑ/ˆEÜ˜%¤Ô&ð #‘
Ü˜E¤3Ô'¨E×,<Ñ,<¸WÔ,Eà&¨Ð.‘
Ü˜E¤3Ô'Ü Ø/°¨wð 7Uð Uóð ô =¸UÓC�
Ø%/ˆM˜'Ñ"Ø�O‰O˜GÔ$ð  +Ÿ™¨|¸TÓBˆØ24ˆÜ�m¤TÔ*Ø× Ñ  Ô/Ø×Ñ˜[Ô)ð 3>À¸Ð1Oˆñ Ø)6ˆL˜Ñ&ð !�zÐ!4Ð5ˆð ˜R Ð$Ð$r(   r8   Úlogging_objÚcustom_llm_providerr?   c                 óÀ   — t        |«      }|j                  d«      }|st        d|› �«      ‚|rt        |||«      }n|}t	        |dd|¬«      }	t        |«      |	_        |	S )a¶  
        Transform the Veo video creation response.

        Veo returns:
        {
            "name": "projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL/operations/OPERATION_ID"
        }

        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
        r3   z#No operation name in Veo response: ÚvideoÚ
processing©ÚidÚobjectÚstatusru   )r>   rG   rI   r   r   rP   Úusage)
rk   ru   r8   r¾   r¿   r?   Úresponse_datarl   Úvideo_idÚ	video_objs
             r)   Útransform_video_create_responsez3VertexAIVideoConfig.transform_video_create_response™  so   € ô*  4°LÓAˆà -× 1Ñ 1°&Ó 9ˆÙÜÐBÀ=À/ÐRÓSÐSáÜ4°^ÐEXÐZ_Ó`‰Hà%ˆHä&¨(¸7È<Ð_dÔeˆ	äEÀlÓSˆ	ŒØÐr(   rÉ   c                 óš   — t        |«      }| j                  |«      }|st        d|› d�«      ‚|j                  d«      › d|› d�}d|i}||fS )z¡
        Transform the video status retrieve request for Veo API.

        Veo polls operations using :fetchPredictOperation endpoint with POST request.
        zInvalid operation name format: zm. Expected format: projects/PROJECT/locations/LOCATION/publishers/google/models/MODEL/operations/OPERATION_IDrn   z:fetchPredictOperationÚoperationName)r   rt   rI   r¬   )	rk   rÉ   r¨   r›   r™   rl   ru   r°   Úparamss	            r)   Ú'transform_video_status_retrieve_requestz;VertexAIVideoConfig.transform_video_status_retrieve_request¾  sx   € ô !:¸(Ó CˆØ×=Ñ=¸nÓMˆáÜØ1°.Ð1Að B~ð ~óð ð !Ÿ™¨Ó,Ð-¨Q¨u¨gÐ5KÐLˆð )¨.Ð9ˆà�Fˆ{Ðr(   c                 óø  — t        |«      }|j                  dd«      }|j                  dd«      }|j                  d«      }| j                  |«      }|rt        |||«      }	n|}	|j                  di «      j                  d«      }
|
r	 t	        |
«      }nt        t        j                  «       «      }|rd}n|rd	}nd
}t        |	d||||¬«      }|S # t
        $ r  t        t        j                  «       «      }Y ŒGw xY w)aÐ  
        Transform the Veo operation status response.

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

        When done=true:
        {
            "name": "projects/.../operations/OPERATION_ID",
            "done": true,
            "response": {
                "@type": "type.googleapis.com/cloud.ai.large_models.vision.GenerateVideoResponse",
                "raiMediaFilteredCount": 0,
                "videos": [
                    {
                        "bytesBase64Encoded": "...",
                        "mimeType": "video/mp4"
                    }
                ]
            }
        }
        r3   rE   r4   FÚerrorr5   r0   ÚfailedÚ	completedrÂ   rÁ   )rÄ   rÅ   rÆ   ru   Ú
created_atrÑ   )	r>   rG   rt   r   r   Ú	Exceptionr†   Útimer   )rk   r8   r¾   r¿   rÈ   rl   Úis_doneÚ
error_dataru   rÉ   Úcreate_time_strrÔ   rÆ   rÊ   s                 r)   Ú(transform_video_status_retrieve_responsez<VertexAIVideoConfig.transform_video_status_retrieve_responseÝ  s	  € ô>  4°LÓAˆà -× 1Ñ 1°&¸"Ó =ˆØ&×*Ñ*¨6°5Ó9ˆØ)×-Ñ-¨gÓ6ˆ
ð ×=Ñ=¸nÓMˆáÜ4°^ÐEXÐZ_Ó`‰Hà%ˆHð "/×!2Ñ!2°:¸rÓ!B×!FÑ!FÀ|Ó!TˆÙð.ÜHÈÓY‘
ô œTŸY™Y›[Ó)ˆJáØ‰FÙØ ‰Fà!ˆFä&ØØØØØ!Øô
ˆ	ð Ðøô) ò .Ü ¤§¡£Ó-’
ð.ús   ÂC Ã&C9Ã8C9Úvariantc                 ó*   — | j                  ||||«      S )a{  
        Transform the video content request for Veo API.

        For Veo, we need to:
        1. Poll the operation status to ensure it's complete
        2. Extract the base64 video data from the response
        3. Return it for decoding

        Since we need to make an HTTP call here, we'll use the same fetchPredictOperation
        approach as status retrieval.
        ©rÏ   )rk   rÉ   r¨   r›   r™   rÛ   s         r)   Útransform_video_content_requestz3VertexAIVideoConfig.transform_video_content_request%  s   € ð& ×;Ñ;¸HÀhÐP^Ð`gÓhÐhr(   c                 ó�  — t        |«      }|j                  dd«      st        d«      ‚	 |j                  di «      }|j                  dg «      }|rt        |«      dk(  rt        d«      ‚|d   }|j                  d«      }|st        d	«      ‚t	        j
                  |«      }|S # t        t        f$ r}	t        d
|	› �«      ‚d}	~	ww xY w)zš
        Transform the Veo video content download response.

        Extracts the base64 encoded video from the response and decodes it to bytes.
        r4   FzaVideo generation is not complete yet. Please check status with video_status() before downloading.r6   r-   r   z*No video data found in completed operationr   z"No base64 encoded video data foundzFailed to extract video data: N)r>   rG   rI   rr   rV   Ú	b64decodeÚKeyErrorÚ
IndexError)
rk   r8   r¾   rÈ   Úvideo_responser-   Ú
video_datar\   Úvideo_bytesÚes
             r)   Ú transform_video_content_responsez4VertexAIVideoConfig.transform_video_content_response:  sÝ   € ô  4°LÓAˆà× Ñ  ¨Ô/ÜØsóð ð	CØ$1×$5Ñ$5°jÀ"Ó$EˆNØ*×.Ñ.¨x¸Ó<ˆFáœS ›[¨AÒ-Ü Ð!MÓNÐNð !' q¡	ˆJØ$.§N¡NÐ3GÓ$HˆNá!Ü Ð!EÓFÐFô "(×!1Ñ!1°.Ó!AˆKØÐøäœ*Ð%ò 	CÜÐ=¸a¸SÐAÓBÐBûð	Cús   ªA8B# Â#CÂ2C Ã CÚ
extra_bodyc                 ó   — t        d«      ‚)z:
        Video remix is not supported by Veo API.
        zbVideo remix is not supported by Vertex AI Veo. Please use video_generation() to create new videos.©ÚNotImplementedError)rk   rÉ   rw   r¨   r›   r™   rè   s          r)   Útransform_video_remix_requestz1VertexAIVideoConfig.transform_video_remix_request`  s   € ô "Øpó
ð 	
r(   c                 ó   — t        d«      ‚)zVideo remix is not supported.z.Video remix is not supported by Vertex AI Veo.rê   ©rk   r8   r¾   r¿   s       r)   Útransform_video_remix_responsez2VertexAIVideoConfig.transform_video_remix_responsep  s   € ô "Ð"RÓSÐSr(   ÚafterÚlimitÚorderÚextra_queryc                 ó   — t        d«      ‚)z9
        Video list is not supported by Veo API.
        zrVideo list is not supported by Vertex AI Veo. Use the operations endpoint directly if you need to list operations.rê   )rk   r¨   r›   r™   rð   rñ   rò   ró   s           r)   Útransform_video_list_requestz0VertexAIVideoConfig.transform_video_list_requesty  s   € ô "ðSó
ð 	
r(   c                 ó   — t        d«      ‚)zVideo list is not supported.z-Video list is not supported by Vertex AI Veo.rê   rî   s       r)   Útransform_video_list_responsez1VertexAIVideoConfig.transform_video_list_response‹  s   € ô "Ð"QÓRÐRr(   c                 ó   — t        d«      ‚)z;
        Video delete is not supported by Veo API.
        z^Video delete is not supported by Vertex AI Veo. Videos are automatically cleaned up by Google.rê   ©rk   rÉ   r¨   r›   r™   s        r)   Útransform_video_delete_requestz2VertexAIVideoConfig.transform_video_delete_request”  s   € ô "Øló
ð 	
r(   c                 ó   — t        d«      ‚)zVideo delete is not supported.z/Video delete is not supported by Vertex AI Veo.rê   ©rk   r8   r¾   s      r)   Útransform_video_delete_responsez3VertexAIVideoConfig.transform_video_delete_response¢  s   € ô "Ð"SÓTÐTr(   rÁ   c                 ó   — t        d«      ‚©Nz5video create character is not supported for Vertex AIrê   )rk   r3   rÁ   r¨   r›   r™   s         r)   Ú(transform_video_create_character_requestz<VertexAIVideoConfig.transform_video_create_character_requestª  ó   € Ü!Ð"YÓZÐZr(   c                 ó   — t        d«      ‚rÿ   rê   rü   s      r)   Ú)transform_video_create_character_responsez=VertexAIVideoConfig.transform_video_create_character_response­  r  r(   c                 ó   — t        d«      ‚©Nz2video get character is not supported for Vertex AIrê   )rk   Úcharacter_idr¨   r›   r™   s        r)   Ú%transform_video_get_character_requestz9VertexAIVideoConfig.transform_video_get_character_request°  ó   € Ü!Ð"VÓWÐWr(   c                 ó   — t        d«      ‚r  rê   rü   s      r)   Ú&transform_video_get_character_responsez:VertexAIVideoConfig.transform_video_get_character_response³  r  r(   c                 ó,   — | j                  ||||¬«      S )zRReturn the fetchPredictOperation URL and body needed to retrieve the source video.)rÉ   r¨   r›   r™   rÝ   rù   s        r)   Úget_video_edit_prefetch_paramsz2VertexAIVideoConfig.get_video_edit_prefetch_params¶  s(   € ð ×;Ñ;ØØØ)Øð	 <ó 
ð 	
r(   Ú
video_fileÚprefetched_source_datac	                 óz  — |€t        d«      ‚|j                  dd«      st        d«      ‚|j                  di «      }	|	j                  dg «      }
|
st        d«      ‚|
d	   }i }d
|v r	|d
   |d
<   n-d|v r|d   |d<   |j                  dd«      |d<   nt        d«      ‚t        |«      }| j                  |«      xs d}||dœ}d|gi}|rXt	        |«      }|j                  dd«      }i }t        |t        «      r|j                  |«       |j                  |«       |r||d<   |j                  d«      › d|› d�}||dfS )a  
        Build a predictLongRunning edit request from the pre-fetched source video.

        The actual fetchPredictOperation HTTP call is hoisted into the handler so
        it can use the shared async/sync httpx client instead of blocking the loop.
        Nz|prefetched_source_data is required for Vertex AI video edit. Ensure get_video_edit_prefetch_params is called by the handler.r4   FzSSource video generation is not complete yet. Check the video status before editing.r6   r-   z8No videos found in the completed operation. Cannot edit.r   r   r   r    z	video/mp4zDSource video has neither gcsUri nor bytesBase64Encoded. Cannot edit.rE   )rw   rÁ   r´   rA   rn   rµ   )	rI   rG   r   rt   rƒ   r¸   r‚   r·   r¬   )rk   rw   rÉ   r¨   r›   r™   r  rè   r  Úsource_responser-   Úsource_videoÚvideo_inputrl   ru   r¹   r?   Úextra_body_copyr‰   r¼   Úedit_urls                        r)   Útransform_video_edit_requestz0VertexAIVideoConfig.transform_video_edit_requestÅ  sˆ  € ð" "Ð)ÜðRóð ð
 &×)Ñ)¨&°%Ô8ÜÐrÓsÐsà8N×8RÑ8RÐS]Ð_aÓ8bˆØ'×+Ñ+¨H°bÓ9ˆÙÜÐWÓXÐXà$ Q™iˆØ-/ˆØ�|Ñ#Ø$0°Ñ$:ˆK˜Ò!Ø! \Ñ1Ø0<Ð=QÑ0RˆKÐ,Ñ-Ø&2×&6Ñ&6°zÀ;Ó&OˆK˜
Ò#äÐcÓdÐdä 9¸(Ó CˆØ×=Ñ=¸nÓMÒSÐQSˆà=CÈkÑ2ZˆØ2=À¸Ð1OˆáÜ%)¨*Ó%5ˆOØ#2×#6Ñ#6°|ÀTÓ#JˆMØ68ˆMÜ˜-¬Ô.Ø×$Ñ$ ]Ô3Ø× Ñ  Ô1ÙØ-:�˜\Ñ*à%Ÿ_™_¨SÓ1Ð2°!°E°7Ð:MÐNˆØ˜ tÐ+Ð+r(   c                 óê   — t        |«      }|j                  d«      }|st        d|› �«      ‚| j                  |«      xs d}|rt	        |||«      }n|}t        |dd|¬«      }	t        |«      |	_        |	S )a=  
        Transform the Veo video edit response.

        Veo returns the same operation response as video generation:
        {"name": "projects/.../operations/OPERATION_ID"}

        usage includes duration_seconds and optional video_resolution from the
        edit request parameters for cost calculation.
        r3   z(No operation name in Veo edit response: rE   rÁ   rÂ   rÃ   )r>   rG   rI   rt   r   r   rP   rÇ   )
rk   r8   r¾   r¿   r?   rÈ   rl   ru   rÉ   rÊ   s
             r)   Útransform_video_edit_responsez1VertexAIVideoConfig.transform_video_edit_response  s�   € ô   4°LÓAˆà -× 1Ñ 1°&Ó 9ˆÙÜÐGÈÀÐWÓXÐXà×=Ñ=¸nÓMÒSÐQSˆáÜ4°^ÐEXÐZ_Ó`‰Hà%ˆHä&ØØØØô	
ˆ	ô FÀlÓSˆ	ŒØÐr(   c                 ó   — t        d«      ‚©Nz.video extension is not supported for Vertex AIrê   )rk   rw   rÉ   ry   r¨   r›   r™   rè   s           r)   Ú!transform_video_extension_requestz5VertexAIVideoConfig.transform_video_extension_request'  s   € ô "Ð"RÓSÐSr(   c                 ó   — t        d«      ‚r  rê   rî   s       r)   Ú"transform_video_extension_responsez6VertexAIVideoConfig.transform_video_extension_response3  s   € Ü!Ð"RÓSÐSr(   Úerror_messageÚstatus_codec                 ó$   — ddl m}  ||||¬«      S )Nr   )ÚVertexAIError)r  Úmessager™   )Ú#litellm.llms.vertex_ai.common_utilsr   )rk   r  r  r™   r   s        r)   Úget_error_classz#VertexAIVideoConfig.get_error_class6  s   € ÝEáØ#Ø!Øô
ð 	
r(   )NNr;   )NNNN)NNN)=r"   r#   r$   Ú__doc__r   re   r   r   r%   r&   rh   rj   Ústaticmethodrt   Úlistr{   r   r7   rƒ   rÅ   r�   r�   r…   r„   r   r§   r±   Útupler   r½   ÚhttpxÚResponseÚLiteLLMLoggingObjr   rË   rÏ   rÚ   rÞ   Úbytesrç   rì   rï   r†   rõ   r÷   rú   rý   r   r  r  r
  r  r   r   r  r  r  r  ÚHeadersr   r#  r'   r(   r)   r_   r_   r   sÉ  … ññ GWàØØØñ		
óGÐ&¨°¸¸c¸Ñ1BÑ(Có ñ EUàØ ØØ ñ		
óEÐ$ h¨w°s¸C°xÑ/@Ñ&Aó ò"ð ð¸#ð À#ÈÁ*ò ó ðð"I°ð I¸ó Ið=à&Fð=ð ð=ð ð	=ð
 
ˆc�6ˆkÑ	ó=ð~	I°#ð 	I¸#À¹*ó 	Ið?°ð ?¸¸d¹
ó ?ð ðe¨cð e°dò eó ðeð #Ø=Añ àð ð ð ð �t‘ð	 ð
 -¨tÑ3°dÑ:ð ð 
ó ðD%àð%ð ˜‘*ð%ð ð	%ð
 
ó%ðNQ%àðQ%ð ðQ%ð ð	Q%ð
 /3ðQ%ð -ðQ%ð ðQ%ð 
ˆt�\ 3Ð&Ñ	'óQ%ðp +/Ø$(ñ#àð#ð —n‘nð#ð 'ð	#ð
 ! 4™Zð#ð ˜T‘kð#ð 
ó#ðJàðð ðð -ð	ð
 ðð 
ˆs�DˆyÑ	óðF +/ñ	Fà—n‘nðFð 'ðFð ! 4™Zð	Fð
 
óFð\ #ñiàðið ðið -ð	ið
 ðið �t‘ðið 
ˆs�DˆyÑ	óið*$Cà—n‘nð$Cð 'ð$Cð 
ó	$CðZ 04ñ
àð
ð ð
ð ð	
ð
 -ð
ð ð
ð ˜˜f˜Ñ%¨Ñ,ð
ð 
ˆs�DˆyÑ	ó
ð( +/ñ	Tà—n‘nðTð 'ðTð ! 4™Zð	Tð
 
óTð !Ø Ø Ø04ñ
àð
ð -ð
ð ð	
ð
 �T‰zð
ð �T‰zð
ð �T‰zð
ð ˜#˜v˜+Ñ&¨Ñ-ð
ð 
ˆs�DˆyÑ	ó
ð, +/ñ	Sà—n‘nðSð 'ðSð ! 4™Zð	Sð
 
ˆc�3ˆh‰óSð
àð
ð ð
ð -ð	
ð
 ð
ð 
ˆs�DˆyÑ	ó
ðUà—n‘nðUð 'ðUð 
ó	Uð[ÀFó [ò[òXòXð
àð
ð ð
ð -ð	
ð
 ð
ð 
ˆs�DˆyÑ	ó
ð, *.Ø/3Ø8<ñ:,àð:,ð ð:,ð ð	:,ð
 -ð:,ð ð:,ð   $Ñ&ð:,ð ˜˜f˜Ñ%¨Ñ,ð:,ð !% S¨# X¡°Ñ 5ð:,ð 
ˆs�G˜C ˜KÑ(¨,¸Ñ*=Ð=Ñ	>ó:,ð@ +/Ø$(ñ$à—n‘nð$ð 'ð$ð ! 4™Zð	$ð
 ˜T‘kð$ð 
ó$ð\ ó
TóTð
¨Sð 
¸sð 
ÈTÐTY×TaÑTaÑMað 
Ðfvô 
r(   r_   )<r$  rV   rÖ   Úcollections.abcr   r   Útypesr   Útypingr   r   r   r	   r
   r   r(  Úhttpx._typesr   r   Útyping_extensionsr   r•   Úlitellm.constantsr   Úlitellm.images.utilsr   Ú+litellm.llms.base_llm.videos.transformationr   r"  r   r   Ú&litellm.llms.vertex_ai.vertex_llm_baser   Úlitellm.types.routerr   Úlitellm.types.videos.mainr   r   Úlitellm.types.videos.utilsr   r   Ú*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjÚ)litellm.llms.base_llm.chat.transformationr   Ú_BaseLLMExceptionr*  r   r,   r/   r2   r)  r>   rƒ   r%   rH   rP   r]   r_   r'   r(   r)   ú<module>r=     s  ðñó Û ß -Ý "ß G× Gã ß 2Ý &ã Ý CÝ 6Ý G÷õ >Ý 5ß S÷ñ
 ÝXõð +ÐØ(ÑàÐØÐô�	 õ ô*˜I¨Uõ *ô˜I¨Uõ ô.�I Uõ .ð u§~¡~ð ¸-ó ð
Ø�s˜C�x‘. 4Ñ'ðà	ˆ#ˆu�s‰{Ð
Ñóð*I°4¸¸S¸±>ó Iô(K
˜/¨:õ K
r(   