o
    vZh                     @   s   d dl Z d dl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 d dlmZ d dlmZmZ d dlmZmZ d d	lmZmZ d d
lmZ eeZdZG dd deeZG dd deZG dd deZG dd deZ G dd deZ!dS )    N)ABC)AnyDictOptionalUnion)urlparse)	constants)InferenceProviderMapping)RequestParameters_as_dict)TaskProviderHelperfilter_none)get_sessionhf_raise_for_status)
get_loggerg      ?c                       sR   e Zd Zdef fddZdededef fddZd	ededefd
dZ  ZS )	FalAITasktaskc                    s   t  jdd|d d S )Nzfal-aizhttps://fal.run)providerbase_urlr   super__init__)selfr   	__class__ Z/var/www/auris/lib/python3.10/site-packages/huggingface_hub/inference/_providers/fal_ai.pyr      s   zFalAITask.__init__headersapi_keyreturnc                    s*   t  ||}|dsd| |d< |S )Nhf_zKey authorization)r   _prepare_headers
startswith)r   r   r   r   r   r   r"      s   
zFalAITask._prepare_headersmapped_modelc                 C   s
   d| S )N/r   r   r$   r   r   r   r   _prepare_route   s   
zFalAITask._prepare_route)	__name__
__module____qualname__strr   r   r"   r'   __classcell__r   r   r   r   r      s    r   c                	       ^   e Zd Z fddZdedededee fddZdd
e	e
ef dee defddZ  ZS )#FalAIAutomaticSpeechRecognitionTaskc                       t  d d S )Nzautomatic-speech-recognitionr   r   r   r   r   r   $      z,FalAIAutomaticSpeechRecognitionTask.__init__inputs
parametersprovider_mapping_infor   c                 C   s   t |tr|dr|}n/t |tr+t|d}| }W d    n1 s&w   Y  t| }d}d| d| }d|it|S )N)zhttp://zhttps://rbz
audio/mpegzdata:z;base64,	audio_url)	
isinstancer+   r#   openreadbase64	b64encodedecoder   )r   r2   r3   r4   r6   fZ	audio_b64content_typer   r   r   _prepare_payload_as_dict'   s   

z<FalAIAutomaticSpeechRecognitionTask._prepare_payload_as_dictNresponserequest_paramsc                 C   s.   t |d }t|tstdt| d|S )Ntextz>Unexpected output format from FalAI API. Expected string, got .)r   r7   r+   
ValueErrortype)r   r@   rA   rB   r   r   r   get_response9   s   
z0FalAIAutomaticSpeechRecognitionTask.get_responseNr(   r)   r*   r   r   r   r	   r   r?   r   bytesr
   rF   r,   r   r   r   r   r.   #   s    
,r.   c                	       r-   )FalAITextToImageTaskc                    r/   )Nztext-to-imager   r0   r   r   r   r   A   r1   zFalAITextToImageTask.__init__r2   r3   r4   r   c                 C   s   d|it |}d|v rd|v r|d|dd|d< |jd ur>tjj|jd|jd}|dd	g|d
< |jdkr>d|d< |S )Npromptwidthheight)rL   rM   Z
image_sizemain)Zrepo_idrevisionfilename   )pathscaleZloraszfal-ai/loraz(stabilityai/stable-diffusion-xl-base-1.0Z
model_name)r   popZadapter_weights_pathr   ZHUGGINGFACE_CO_URL_TEMPLATEformatZhf_model_idZprovider_id)r   r2   r3   r4   payloadZ	lora_pathr   r   r   r?   D   s$   


z-FalAITextToImageTask._prepare_payload_as_dictNr@   rA   c                 C   s"   t |d d d }t |jS )NZimagesr   urlr   r   getcontentr   r@   rA   rW   r   r   r   rF   ^   s   z!FalAITextToImageTask.get_responserG   rH   r   r   r   r   rJ   @   s    
,rJ   c                	       r-   )FalAITextToSpeechTaskc                    r/   )Nztext-to-speechr   r0   r   r   r   r   d   r1   zFalAITextToSpeechTask.__init__r2   r3   r4   r   c                 C      d|it |S )NrB   r   r   r2   r3   r4   r   r   r   r?   g      z.FalAITextToSpeechTask._prepare_payload_as_dictNr@   rA   c                 C   s   t |d d }t |jS )NZaudiorW   rX   r[   r   r   r   rF   l   s   z"FalAITextToSpeechTask.get_responserG   rH   r   r   r   r   r\   c   s    
,r\   c                	       s   e Zd Z fddZdedef fddZdededefdd	Zd
edede	de
e fddZ	ddeeef de
e defddZ  ZS )FalAITextToVideoTaskc                    r/   )Nztext-to-videor   r0   r   r   r   r   r   r1   zFalAITextToVideoTask.__init__r   r   c                    s.   | drt |S td| j d dS )Nr    z	Calling 'z' provider directly.zhttps://queue.fal.run)r#   r   _prepare_base_urlloggerinfor   )r   r   r   r   r   rb   u   s   
z&FalAITextToVideoTask._prepare_base_urlr$   c                 C   s    | drd| dS d| S )Nr    r%   z?_subdomain=queue)r#   r&   r   r   r   r'   |   s   

z#FalAITextToVideoTask._prepare_router2   r3   r4   c                 C   r]   )NrK   r^   r_   r   r   r   r?      r`   z-FalAITextToVideoTask._prepare_payload_as_dictNr@   rA   c                 C   s6  t |}|d}|std|d u rtdt|j}|j d|j |jdkr*dnd }|jr7d|j nd}t|d	j}| t	| d
| }	| t	| | }
|d}t
d |dkrtt t j|	|jd}t| | d}|dksdt j|
|jd }t |d d }t |jS )N
request_idz#No request ID found in the responsez[A `RequestParameters` object should be provided to get text-to-video responses with Fal AI.z://zrouter.huggingface.coz/fal-ai ?Zresponse_urlz/statusstatusz5Generating the video.. this can take several minutes.Z	COMPLETED)r   ZvideorW   )r   rY   rD   r   rW   schemenetlocqueryrR   r+   rc   rd   timesleep_POLLING_INTERVALr   r   r   jsonrZ   )r   r@   rA   Zresponse_dictre   
parsed_urlr   Zquery_paramZmodel_idZ
status_urlZ
result_urlrh   Zstatus_responserW   r   r   r   rF      s2   

$


z!FalAITextToVideoTask.get_responserG   )r(   r)   r*   r   r+   rb   r'   r   r   r	   r   r?   r   rI   r
   rF   r,   r   r   r   r   ra   q   s*    

ra   )"r:   rl   abcr   typingr   r   r   r   urllib.parser   Zhuggingface_hubr   Zhuggingface_hub.hf_apir	   Z!huggingface_hub.inference._commonr
   r   Z,huggingface_hub.inference._providers._commonr   r   Zhuggingface_hub.utilsr   r   Zhuggingface_hub.utils.loggingr   r(   rc   rn   r   r.   rJ   r\   ra   r   r   r   r   <module>   s$    #