Ë
    uPêj«B  ã                   ó¼   — d dl Z 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	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Zd d	lmZ eZneZ G d
„ de«      Zy)é    N)ÚTYPE_CHECKINGÚAnyÚFinal)Úverbose_logger)ÚRUNWAYML_DEFAULT_API_VERSIONÚRUNWAYML_POLLING_TIMEOUT)ÚBaseImageGenerationConfig)Úget_secret_str)ÚAllMessageValuesÚ#OpenAIImageGenerationOptionalParams)ÚImageObjectÚImageResponse)ÚLoggingc                   ó”  — e Zd ZU dZdZeed<   dZeed<   	 d*dedz  dedz  d	ed
edede	dz  defd„Z
	 	 d+ded	edee   d
edededz  dedz  defd„Zedeeef   dedefd„«       Zedededdfd„«       Zedeeef   defd„«       Z	 d,dededeeef   dedej,                  f
d„Z	 d,dededeeef   dedej,                  f
d„Z	 	 d+d	edej,                  dededed
ededd dedz  d!e	dz  defd"„Z	 	 d+d	edej,                  dededed
ededd dedz  d!e	dz  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defd)„Zy)-ÚRunwayMLImageGenerationConfigz=
    Configuration for RunwayML image generation models.
    zhttps://api.dev.runwayml.comÚDEFAULT_BASE_URLzv1/text_to_imageÚIMAGE_GENERATION_ENDPOINTNÚapi_baseÚapi_keyÚmodelÚoptional_paramsÚlitellm_paramsÚstreamÚreturnc                 óœ   — |xs t        d«      xs | j                  }|j                  d«      }| j                  r|› d| j                  › �}|S )zi
        Get the complete url for the request

        Some providers need `model` in `api_base`
        ÚRUNWAYML_API_BASEú/)r
   r   Úrstripr   )Úselfr   r   r   r   r   r   Úcomplete_urls           úz/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/runwayml/image_generation/transformation.pyÚget_complete_urlz.RunwayMLImageGenerationConfig.get_complete_url(   sU   € ð %Òd¬Ð7JÓ(KÒdÈt×OdÑOdˆà#×*Ñ*¨3Ó/ˆØ×)Ò)Ø*˜^¨1¨T×-KÑ-KÐ,LÐMˆLØÐó    ÚheadersÚmessagesc                 óz   — |xs t        d«      xs t        d«      }|st        d«      ‚d|› �|d<   t        |d<   |S )NÚRUNWAYML_API_SECRETÚRUNWAYML_API_KEYz2RUNWAYML_API_SECRET or RUNWAYML_API_KEY is not setzBearer ÚAuthorizationúX-Runway-Version)r
   Ú
ValueErrorr   )	r   r$   r   r%   r   r   r   r   Úfinal_api_keys	            r!   Úvalidate_environmentz2RunwayMLImageGenerationConfig.validate_environment=   sT   € ð Òb”~Ð&;Ó<ÒbÄÐOaÓ@bð 	ñ ÜÐQÓRÐRà%,¨]¨OÐ#<ˆ�Ñ Ü&BˆÐ"Ñ#Øˆr#   Úresponse_dataÚmodel_responsec           
      óš  — |j                   sg |_         | j                  dg «      }t        |t        «      r•|D ]�  }t        |t        «      r'|j                   j                  t        |d¬«      «       Œ:t        |t        «      sŒK|j                   j                  t        |j                  dd«      |j                  dd«      ¬«      «       Œ’ |S )a  
        Transform RunwayML response format to OpenAI ImageResponse format.

        RunwayML response format (after polling):
        {
            "id": "task_123...",
            "status": "SUCCEEDED",
            "output": ["https://cloudfront.net/.../image.png"],
            "completedAt": "2025-11-13T..."
        }

        OpenAI ImageResponse format:
        {
            "data": [
                {
                    "url": "https://cloudfront.net/.../image.png",
                    "b64_json": null
                }
            ]
        }

        Args:
            response_data: JSON response from RunwayML (after polling completes)
            model_response: ImageResponse object to populate

        Returns:
            Populated ImageResponse in OpenAI format
        ÚoutputN)ÚurlÚb64_jsonr2   r3   )ÚdataÚgetÚ
isinstanceÚlistÚstrÚappendr   Údict)r.   r/   r1   Ú
image_items       r!   Ú&_transform_runwayml_response_to_openaizDRunwayMLImageGenerationConfig._transform_runwayml_response_to_openaiQ   s»   € ðB ×"Ò"Ø"$ˆNÔð &×)Ñ)¨(°BÓ7ˆä�fœdÔ#Ø$ò �
Ü˜j¬#Ô.à"×'Ñ'×.Ñ.Ü#Ø *Ø%)ôõô   
¬DÕ1à"×'Ñ'×.Ñ.Ü#Ø *§¡¨u°dÓ ;Ø%/§^¡^°JÀÓ%Eôõðð$ Ðr#   Ú
start_timeÚtimeout_secsc                 óV   — t        j                   «       | z
  |kD  rt        d|› d�«      ‚y)zù
        Check if operation has timed out.

        Args:
            start_time: Start time of the operation
            timeout_secs: Timeout duration in seconds

        Raises:
            TimeoutError: If operation has exceeded timeout
        z&RunwayML task polling timed out after z secondsN)ÚtimeÚTimeoutError©r=   r>   s     r!   Ú_check_timeoutz,RunwayMLImageGenerationConfig._check_timeoutŽ   s2   € ô �9‰9‹;˜Ñ# lÒ2ÜÐ!GÈÀ~ÐU]Ð^Ó_Ð_ð 3r#   c                 ó6  — | j                  dd«      j                  «       }t        j                  d|«       |dk(  ry|dk(  r6| j                  dd«      }| j                  d	d
«      }t	        d|› d|› d�«      ‚|dk(  rt	        d«      ‚|dv ryt	        d|› �«      ‚)a—  
        Check RunwayML task status from response.

        RunwayML statuses: PENDING, RUNNING, SUCCEEDED, FAILED, CANCELLED, THROTTLED

        Args:
            response_data: JSON response from RunwayML task endpoint

        Returns:
            Normalized status string: "running", "succeeded", or raises on failure

        Raises:
            ValueError: If task failed or status is unknown
        ÚstatusÚ zRunwayML task status: %sÚ	SUCCEEDEDÚ	succeededÚFAILEDÚfailurezUnknown errorÚfailureCodeÚunknownz"RunwayML image generation failed: z (code: ú)Ú	CANCELLEDz'RunwayML image generation was cancelled)ÚPENDINGÚRUNNINGÚ	THROTTLEDÚrunningzUnknown RunwayML task status: )r5   Úupperr   Údebugr+   )r.   rE   Úfailure_reasonÚfailure_codes       r!   Ú_check_task_statusz0RunwayMLImageGenerationConfig._check_task_status�   sº   € ð  &×)Ñ)¨(°BÓ7×=Ñ=Ó?ˆä×ÑÐ7¸Ô@à�[Ò ØØ�xÒØ$1×$5Ñ$5°iÀÓ$QˆNØ"/×"3Ñ"3°MÀ9Ó"MˆLÜÐAÀ.ÐAQÐQYÐZfÐYgÐghÐiÓjÐjØ�{Ò"ÜÐFÓGÐGØÐ:Ñ:ØäÐ=¸f¸XÐFÓGÐGr#   Útask_idc                 ó–  — ddl m}  |«       }t        j                  «       }|j                  d«      }|› d|› �}t	        j
                  d|«       	 | j                  ||¬«       |j                  ||¬«      }	|	j                  «        |	j                  «       }
| j                  |
¬«      }|d	k(  r|	S |d
k(  rt        j                  d«       Œz)a  
        Poll RunwayML task until completion (sync).

        RunwayML POST returns immediately with a task that has status PENDING/RUNNING.
        We need to poll GET /v1/tasks/{task_id} until status is SUCCEEDED or FAILED.

        Args:
            task_id: The task ID to poll
            api_base: Base URL for RunwayML API
            headers: Request headers (including auth)
            timeout_secs: Total timeout in seconds (default: 600s = 10 minutes)

        Returns:
            Final response with completed task
        r   )Ú_get_httpx_clientr   ú
/v1/tasks/zPolling RunwayML task: %srB   ©r2   r$   ©r.   rH   rR   é   )Ú&litellm.llms.custom_httpx.http_handlerrZ   r@   r   r   rT   rC   r5   Úraise_for_statusÚjsonrW   Úsleep)r   rX   r   r$   r>   rZ   Úclientr=   Útask_urlÚresponser.   rE   s               r!   Ú_poll_task_syncz-RunwayMLImageGenerationConfig._poll_task_sync¾   sÇ   € õ, 	Má)Ó+ˆÜ ŸI™I›Kˆ
ð —?‘? 3Ó'ˆØ%˜J j°°	Ð:ˆä×ÑÐ8¸(ÔCàØ×Ñ¨:ÀLÐÔQð —z‘z h¸�zÓ@ˆHØ×%Ñ%Ô'à$ŸM™M›OˆMð ×,Ñ,¸=Ð,ÓIˆFà˜Ò$Ø�Ø˜9Ò$ä—
‘
˜1”ð! r#   c              ƒ   óú  K  — ddl }ddlm}  ||j                  j                  ¬«      }t        j
                  «       }|j                  d«      }|› d|› �}	t        j                  d|	«       	 | j                  ||¬«       |j                  |	|¬	«      ƒ d{  –—† }
|
j                  «        |
j                  «       }| j                  |¬
«      }|dk(  r|
S |dk(  rt        j                  d«      ƒ d{  –—†  ŒŠ7 Œ`7 Œ­w)am  
        Poll RunwayML task until completion (async).

        Args:
            task_id: The task ID to poll
            api_base: Base URL for RunwayML API
            headers: Request headers (including auth)
            timeout_secs: Total timeout in seconds (default: 600s = 10 minutes)

        Returns:
            Final response with completed task
        r   N)Úget_async_httpx_client)Úllm_providerr   r[   z!Polling RunwayML task (async): %srB   r\   r]   rH   rR   r^   )Úlitellmr_   rh   ÚLlmProvidersÚRUNWAYMLr@   r   r   rT   rC   r5   r`   ra   rW   Úasynciorb   )r   rX   r   r$   r>   rj   rh   rc   r=   rd   re   r.   rE   s                r!   Ú_poll_task_asyncz.RunwayMLImageGenerationConfig._poll_task_asyncñ   sñ   è ø€ ó& 	ÝQá.¸G×<PÑ<P×<YÑ<YÔZˆÜ ŸI™I›Kˆ
ð —?‘? 3Ó'ˆØ%˜J j°°	Ð:ˆä×ÑÐ@À(ÔKàØ×Ñ¨:ÀLÐÔQð $ŸZ™Z¨H¸g˜ZÓF×FˆHØ×%Ñ%Ô'à$ŸM™M›OˆMð ×,Ñ,¸=Ð,ÓIˆFà˜Ò$Ø�Ø˜9Ò$ä—m‘m AÓ&×&Ð&ð! ð Gøð 'ús%   ‚BC;ÂC7ÂAC;Ã1C9Ã2C;Ã9C;Úraw_responseÚlogging_objÚrequest_dataÚencodingztiktoken.Encoding | NoneÚ	json_modec                 óZ  — 	 |j                  «       }t        j                  d«       |j                  d«      }|st        d«      ‚|j                  j                  j                  dd«      |j                  j                  j                  d	t        «      d
œ}| j                  || j                  |t        ¬«      }|j                  «       }t        j                  d«       | j                  ||¬«      S # t        $ r0}| j                  d|› �|j                  |j                  ¬«      ‚d}~ww xY w)am  
        Transform the image generation response to the litellm image response.

        RunwayML returns a task immediately with status PENDING/RUNNING.
        We need to poll the task until it completes (status SUCCEEDED).

        Initial response:
        {
            "id": "task_123...",
            "status": "PENDING" | "RUNNING",
            "createdAt": "2025-11-13T..."
        }

        After polling:
        {
            "id": "task_123...",
            "status": "SUCCEEDED",
            "output": ["https://cloudfront.net/.../image.png"],
            "completedAt": "2025-11-13T..."
        }
        ú.Error transforming image generation response: ©Úerror_messageÚstatus_coder$   NzRunwayML starting polling...Úidú!RunwayML response missing task IDr)   rF   r*   ©r)   r*   ©rX   r   r$   r>   z8RunwayML polling complete, transforming to OpenAI format©r.   r/   )ra   Ú	ExceptionÚget_error_classrx   r$   r   rT   r5   r+   Úrequestr   rf   r   r   r<   ©r   r   ro   r/   rp   rq   r   r   rr   r   rs   r.   ÚerX   Úpoll_headerss                  r!   Ú#transform_image_generation_responsezARunwayMLImageGenerationConfig.transform_image_generation_response"  s:  € ðD	Ø(×-Ñ-Ó/ˆMô 	×ÑÐ;Ô<ð '×*Ñ*¨4Ó0ˆÙÜÐ@ÓAÐAð *×1Ñ1×9Ñ9×=Ñ=¸oÈrÓRØ ,× 4Ñ 4× <Ñ <× @Ñ @ÐASÔUqÓ rñ
ˆð ×+Ñ+ØØ×*Ñ*Ø Ü1ð	 ,ó 
ˆð %×)Ñ)Ó+ˆä×ÑÐWÔXð ×:Ñ:Ø'Ø)ð ;ó 
ð 	
øôE ò 	Ø×&Ñ&Ø NÈqÈcÐRØ(×4Ñ4Ø$×,Ñ,ð 'ó ð ûð	ús   ‚C1 Ã1	D*Ã:+D%Ä%D*c              ƒ   óv  K  — 	 |j                  «       }t        j                  d«       |j                  d«      }|st        d«      ‚|j                  j                  j                  dd«      |j                  j                  j                  d	t        «      d
œ}| j                  || j                  |t        ¬«      ƒ d{  –—† }|j                  «       }t        j                  d«       | j                  ||¬«      S # t        $ r0}| j                  d|› �|j                  |j                  ¬«      ‚d}~ww xY w7 Œx­w)a  
        Async transform the image generation response to the litellm image response.

        RunwayML returns a task immediately with status PENDING/RUNNING.
        We need to poll the task until it completes (status SUCCEEDED) using async polling.
        ru   rv   Nz$RunwayML starting polling (async)...ry   rz   r)   rF   r*   r{   r|   z@RunwayML polling complete (async), transforming to OpenAI formatr}   )ra   r~   r   rx   r$   r   rT   r5   r+   r€   r   rn   r   r   r<   r�   s                  r!   Ú)async_transform_image_generation_responsezGRunwayMLImageGenerationConfig.async_transform_image_generation_responsem  sG  è ø€ ð&	Ø(×-Ñ-Ó/ˆMô 	×ÑÐCÔDð '×*Ñ*¨4Ó0ˆÙÜÐ@ÓAÐAð *×1Ñ1×9Ñ9×=Ñ=¸oÈrÓRØ ,× 4Ñ 4× <Ñ <× @Ñ @ÐASÔUqÓ rñ
ˆð "×2Ñ2ØØ×*Ñ*Ø Ü1ð	 3ó 
÷ 
ˆð %×)Ñ)Ó+ˆä×ÑÐ_Ô`ð ×:Ñ:Ø'Ø)ð ;ó 
ð 	
øôE ò 	Ø×&Ñ&Ø NÈqÈcÐRØ(×4Ñ4Ø$×,Ñ,ð 'ó ð ûð	úð*
ús4   ‚D9„C; ”B*D9Â>D7Â?<D9Ã;	D4Ä+D/Ä/D4Ä4D9c                 ó   — dgS )zO
        Get supported OpenAI parameters for RunwayML image generation
        Úsize© )r   r   s     r!   Úget_supported_openai_paramsz9RunwayMLImageGenerationConfig.get_supported_openai_params©  s   € ð
 ð
ð 	
r#   Únon_default_paramsÚdrop_paramsc           
      óÔ   — | j                  |«      }d|v r"|d   }ddddddœ}|j                  |d«      |d<   |D ]+  }||vsŒ||v r	||   ||<   Œ|rŒt        d	|› d
|› d|› d�«      ‚ |S )Nrˆ   z	1024:1024z	1792:1024z	1024:1792ú	1920:1080z	1080:1920)Ú	1024x1024Ú	1792x1024Ú	1024x1792Ú	1920x1080Ú	1080x1920Úratioz
Parameter z is not supported for model z. Supported parameters are z6. Set drop_params=True to drop unsupported parameters.)rŠ   r5   r+   )	r   r‹   r   r   rŒ   Úsupported_paramsrˆ   Úsize_to_ratio_mapÚks	            r!   Úmap_openai_paramsz/RunwayMLImageGenerationConfig.map_openai_params±  sÊ   € ð #'×"BÑ"BÀ5Ó"IÐð Ð'Ñ'Ø,¨VÑ4ˆDð )Ø(Ø(Ø(Ø(ñ(Ðð (9×'<Ñ'<¸TÀ;Ó'OˆO˜GÑ$à#ò 		ˆAØ˜Ò'ØÐ(Ñ(Ø);¸AÑ)>�O AÒ&Ù Øä$Ø$ Q CÐ'CÀEÀ7ÐJeÐfvÐewð  xnð  oóð ð		ð Ðr#   Úpromptc                 óŠ   — |xs d|dœ}d|v r	|d   |d<   nd|d<   |j                  «       D ]  \  }}||vsŒ|dvsŒ|||<   Œ |S )a.  
        Transform the image generation request to the RunwayML image generation request body

        RunwayML expects:
        - model: The model to use (e.g., 'gen4_image')
        - promptText: The text prompt
        - ratio: The aspect ratio (e.g., '1920:1080', '1080:1920', '1024:1024')
        Ú
gen4_image)r   Ú
promptTextr”   rŽ   )rˆ   )Úitems)	r   r   r™   r   r   r$   Úrunwayml_request_bodyr—   Úvs	            r!   Ú"transform_image_generation_requestz@RunwayMLImageGenerationConfig.transform_image_generation_requestÔ  s   € ð" Ò*˜lØ ñ(
Ðð �oÑ%Ø-<¸WÑ-EÐ! 'Ò*ð .9Ð! 'Ñ*ð $×)Ñ)Ó+ò 	-‰DˆAˆqØÐ-Ò-°!¸8Ò2CØ+,Ð% aÒ(ð	-ð %Ð$r#   )N)NN)iX  ) Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r8   Ú__annotations__r   r:   Úboolr"   r7   r   r-   Ústaticmethodr   r   r<   ÚfloatrC   rW   ÚhttpxÚResponserf   rn   ÚLiteLLMLoggingObjr„   r†   r   rŠ   r˜   r    r‰   r#   r!   r   r       sª  … ñð ;Ð�cÓ:Ø%7Ð˜sÓ7ð #ñà˜‘*ðð �t‘ðð ð	ð
 ðð ðð �t‘ðð 
óð8 #Ø#ñàðð ðð Ð'Ñ(ð	ð
 ðð ðð �t‘ðð ˜‘*ðð 
óð( ð:Ø˜C ˜H‘~ð:à%ð:ð 
ò:ó ð:ðx ð` 5ð `¸ð `À$ò `ó ð`ð ðH¨$¨s°C¨x©.ð H¸Sò Hó ðHðJ "ñ1àð1ð ð1ð �c˜3�h‘ð	1ð
 ð1ð 
�‰ó1ðp "ñ/'àð/'ð ð/'ð �c˜3�h‘ð	/'ð
 ð/'ð 
�‰ó/'ðv #Ø!%ñI
àðI
ð —n‘nðI
ð &ð	I
ð
 'ðI
ð ðI
ð ðI
ð ðI
ð -ðI
ð �t‘ðI
ð ˜$‘;ðI
ð 
óI
ðj #Ø!%ñ:
àð:
ð —n‘nð:
ð &ð	:
ð
 'ð:
ð ð:
ð ð:
ð ð:
ð -ð:
ð �t‘ð:
ð ˜$‘;ð:
ð 
ó:
ðx
°ð 
¸Ð>aÑ9bó 
ð!à ð!ð ð!ð ð	!ð
 ð!ð 
ó!ðF!%àð!%ð ð!%ð ð	!%ð
 ð!%ð ð!%ð 
ô!%r#   r   )rm   r@   Útypingr   r   r   r©   Úlitellm._loggingr   Úlitellm.constantsr   r   Ú5litellm.llms.base_llm.image_generation.transformationr	   Úlitellm.secret_managers.mainr
   Úlitellm.types.llms.openair   r   Úlitellm.types.utilsr   r   ÚtiktokenÚ*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjr«   r   r‰   r#   r!   ú<module>r¶      sT   ðÛ Û ß ,Ñ ,ã å +÷õõ 8÷÷ ;áÛåXà*ÑàÐôU%Ð$=õ U%r#   