Ë
    uPêj(  ã                   ó”  — U d 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 dd
lmZmZ ddlmZ ddlmZ ddlmZ ddlmZ  eh d£«      Ze	ed<   dZe	ed<    eddddœ«      Z e	ed<   de!de"fd„Z#de!de!fd„Z$de"ddfd„Z%de"de!ddfd „Z&d!e"de!ddfd"„Z'd#e"de!de"fd$„Z(d%e!de)e"ef   fd&„Z* G d'„ d(e«      Z+y))zJVideo generation for Hosted VLLM (vLLM-Omni OpenAI-compatible /v1/videos).é    N)ÚMapping)ÚBufferedReader)ÚMappingProxyType)ÚFinal)Úurlparse)Ú	FileTypesÚRequestFiles)ÚImageEditRequestUtils)Ú	SSRFErrorÚvalidate_url)ÚOpenAIVideoConfig)Úget_secret_str)ÚGenericLiteLLMParams)Ú VideoCreateOptionalRequestParams>	   ÚmodelÚpromptÚtimeoutÚ
charactersÚ
extra_bodyÚextra_queryÚextra_headersÚinput_referenceÚcustom_llm_providerÚ_EXCLUDED_FORM_KEYS)Úimage_referenceÚvideo_referenceÚaudio_referenceÚwidthÚheightÚ
num_framesÚfpsÚnum_inference_stepsÚguidance_scaleÚguidance_scale_2Úboundary_ratioÚ
flow_shiftÚtrue_cfg_scaleÚseedÚgenerate_soundÚsound_durationÚnegative_promptÚenable_frame_interpolationÚframe_interpolation_expÚframe_interpolation_scaleÚframe_interpolation_model_pathÚloraÚextra_paramsÚaspect_ratioÚ_VLLM_OMNI_VIDEO_PARAMSÚ	image_urlÚ	video_urlÚ	audio_url)r   r   r   Ú_REFERENCE_URL_KEYSÚvalueÚreturnc                 óÈ   — t        | t        «      r| S t        | t        «      r| rdS dS t        | t        t        t
        f«      rt        j                  | «      S t        | «      S )NÚtrueÚfalse)Ú
isinstanceÚstrÚboolr   ÚlistÚtupleÚjsonÚdumps)r8   s    ús/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/hosted_vllm/videos/transformation.pyÚ_serialize_form_valuerE   E   sR   € Ü�%œÔØˆÜ�%œÔÙˆvÐ+ GÐ+Ü�%œ'¤4¬Ð/Ô0Ü�z‰z˜%Ó Ð Üˆu‹:Ðó    c                 ó†   — t        | t        «      s| S | j                  «       }|r|d   dvr| S t        j                  |«      S )Nr   z{[)r=   r>   ÚstriprB   Úloads)r8   Ústrippeds     rD   Ú_maybe_jsonrK   O   s>   € Ü�eœSÔ!ØˆØ—k‘k“m€HÙ�x ‘{¨$Ñ.ØˆÜ�:‰:�hÓÐrF   Úurlc                 ó�   — t        | «      j                  j                  «       }|dv ry |dvrt        d|› d�«      ‚t	        | «       y )N)Ú Údata)ÚhttpÚhttpszURL scheme 'z' is not allowed)r   ÚschemeÚlowerr   r   )rL   rR   s     rD   Ú_reject_unsafe_media_urlrT   X   sK   € Ü˜S“M×(Ñ(×.Ñ.Ó0€FØ�ÑØØÐ&Ñ&Ü˜, v hÐ.>Ð?Ó@Ð@Ü�ÕrF   Úurl_keyÚitemc                 ó€   — t        |t        «      sy |j                  | «      }t        |t        «      rt	        |«       y y ©N)r=   r   Úgetr>   rT   )rU   rV   rL   s      rD   Ú_reject_unsafe_urls_in_itemrZ   a   s4   € Ü�dœGÔ$ØØ—‘˜'Ó"€CÜ�#”sÔÜ  Õ%ð rF   Ú
field_namec                 óÌ   — t         j                  | «      }|€y t        |«      }t        |t        «      r|D ]  }t        ||«       Œ y t        |t        «      rt        ||«       y y rX   )r7   rY   rK   r=   r@   rZ   r   )r[   r8   rU   ÚparsedrV   s        rD   Ú_reject_unsafe_media_urlsr^   i   sc   € Ü(×,Ñ,¨ZÓ8€GØ€ØÜ Ó&€FÜ�&œ$ÔØò 	7ˆDÜ'¨°Õ6ð	7àÜ�&œ'Ô"Ü# G¨VÕ4ð #rF   Úkeyc                 ó0   — t        | |«       t        |«      S rX   )r^   rE   )r_   r8   s     rD   Ú_form_valuera   v   s   € Ü˜c 5Ô)Ü  Ó'Ð'rF   Ú	referencec                 ó|   — t        j                  | «      }t        | t        «      rd| j                  | |ffS dd| |ffS )Nr   zinput_reference.png)r
   Úget_image_content_typer=   r   Úname)rb   Úcontent_types     rD   Ú_input_reference_filerg   {   sE   € Ü/×FÑFÀyÓQ€LÜ�)œ^Ô,Ø! I§N¡N°I¸|Ð#LÐMÐMØÐ 5°yÀ,ÐOÐPÐPrF   c                   óÀ   ‡ — e Zd ZdZdedefˆ fd„Zdededede	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ˆ xZS )ÚHostedVLLMVideoConfigz 
    vLLM-Omni videos API is OpenAI-compatible but requires multipart/form-data.

    https://docs.vllm.ai/projects/vllm-omni/en/latest/serving/videos_api/
    r   r9   c                 ó2   •— g t         ‰| �  |«      ¢t        ¢S rX   )ÚsuperÚget_supported_openai_paramsr3   )Úselfr   Ú	__class__s     €rD   rl   z1HostedVLLMVideoConfig.get_supported_openai_params‰   s'   ø€ ð
Ü‰WÑ0°Ó7ð
ä$ð
ð 	
rF   Úvideo_create_optional_paramsÚdrop_paramsc                 ó\   — |j                  «       D ��ci c]  \  }}|€Œ	||“Œ c}}S c c}}w rX   )Úitems)rm   ro   r   rp   r_   r8   s         rD   Úmap_openai_paramsz'HostedVLLMVideoConfig.map_openai_params�   s9   € ð *F×)KÑ)KÓ)M÷
Ù%˜3 ÐQVÑQbˆC�‰Jó
ð 	
ùó 
s   ”
(Ÿ(NÚheadersÚapi_keyÚlitellm_paramsc                 ób   — |�|j                   nd xs |xs t        d«      xs d}i |¥dd|› �i¥S )NÚHOSTED_VLLM_API_KEYzfake-api-keyÚAuthorizationzBearer )ru   r   )rm   rt   r   ru   rv   Úresolved_keys         rD   Úvalidate_environmentz*HostedVLLMVideoConfig.validate_environment™   sU   € ð (6Ð'Aˆ^×#Ò#Àtò ØòäÐ3Ó4òð ð	 	ð F�'ÐE˜?¨g°l°^Ð,DÑEÐErF   Úapi_basec                 ó’   — |xs t        d«      }|€t        d«      ‚|j                  d«      }|j                  d«      r|› d�S |› d�S )NÚHOSTED_VLLM_API_BASEztapi_base not set for Hosted VLLM videos API. Set via api_base parameter or HOSTED_VLLM_API_BASE environment variableú/z/v1z/videosz
/v1/videos)r   Ú
ValueErrorÚrstripÚendswith)rm   r   r|   rv   Úresolved_api_baseÚtrimmeds         rD   Úget_complete_urlz&HostedVLLMVideoConfig.get_complete_url¨   sh   € ð $,Ò#U¬~Ð>TÓ/UÐØÐ$ÜðZóð ð +×1Ñ1°#Ó6ˆØ×Ñ˜EÔ"Ø�Y˜gÐ&Ð&Ø�˜*Ð%Ð%rF   r   Ú$video_create_optional_request_paramsc           
      óÖ   — ||dœ|j                  «       D ��ci c]  \  }}|t        vr|�|t        ||«      “Œ c}}¥}	|j                  d«      }
|
€|	d|fS |	t	        |
«      f|fS c c}}w )N)r   r   r   © )rr   r   ra   rY   rg   )rm   r   r   r|   r†   rv   rt   r_   r8   rO   r   s              rD   Útransform_video_create_requestz4HostedVLLMVideoConfig.transform_video_create_request¹   s˜   € ð Øñ
ð
 #G×"LÑ"LÓ"N÷á�C˜ØÔ1Ñ1°eÐ6Gð ”[  eÓ,Ñ,óð
ˆð "F×!IÑ!IÐJ[Ó!\ˆØÐ"Ø˜˜XÐ%Ð%ØÔ+¨OÓ<Ð>ÀÐHÐHùós   ˜!A%)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r>   r@   rl   r   r?   Údictrs   r   r{   r…   rA   r	   r‰   Ú__classcell__)rn   s   @rD   ri   ri   ‚   s  ø„ ñð
°ð 
¸õ 
ð
à&Fð
ð ð
ð ð	
ð
 
ó
ð #Ø6:ñFàðFð ðFð �t‘ð	Fð
 -¨tÑ3ðFð 
óFð&àð&ð ˜‘*ð&ð ð	&ð
 
ó&ð"IàðIð ðIð ð	Ið
 /3ðIð -ðIð ðIð 
ˆt�\ 3Ð&Ñ	'÷IrF   ri   ),r�   rB   Úcollections.abcr   Úior   Útypesr   Útypingr   Úurllib.parser   Úhttpx._typesr   r	   Úlitellm.images.utilsr
   Ú$litellm.litellm_core_utils.url_utilsr   r   Ú)litellm.llms.openai.videos.transformationr   Úlitellm.secret_managers.mainr   Úlitellm.types.routerr   Úlitellm.types.videos.mainr   Ú	frozensetr   Ú__annotations__r3   r7   Úobjectr>   rE   rK   rT   rZ   r^   ra   rA   rg   ri   rˆ   rF   rD   ú<module>rŸ      s.  ðÚ Pã Ý #Ý Ý "Ý Ý !ç 0å 6ß HÝ GÝ 7Ý 5Ý Fá&ò
óÐ �Uó ð"Ð ˜ó ñ6 .à&Ø&Ø&ñóÐ �Uó ð ð ¨Có ð �vð   &ó  ð #ð ¨$ó ð&¨ð &°Fð &¸tó &ð
5¨#ð 
5°fð 
5Àó 
5ð(�Sð ( ð (¨Có (ð
Q Vð Q°°c¸9°nÑ0Eó QôLIÐ-õ LIrF   