o
    i'                     @   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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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#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_as_url)TaskProviderHelperfilter_none)get_sessionhf_raise_for_status)
get_loggerg      ?c                       sZ   e Zd Zdef fddZdededeeef f fddZd	ededefd
dZ  Z	S )	FalAITasktaskc                       t  jdd|d d S )Nfal-aizhttps://fal.runproviderbase_urlr   super__init__selfr   	__class__ _/home/ubuntu/.local/lib/python3.10/site-packages/huggingface_hub/inference/_providers/fal_ai.pyr         zFalAITask.__init__headersapi_keyreturnc                    *   t  ||}|dsd| |d< |S Nhf_zKey authorizationr   _prepare_headers
startswithr   r#   r$   r   r    r!   r+         
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+   r2   __classcell__r    r    r   r!   r      s    "r   c                       s   e Zd Zdef fddZdededeeef f fddZd	ededefd
dZ	dde	e
ef dee defddZ  ZS )FalAIQueueTaskr   c                    r   )Nr   zhttps://queue.fal.runr   r   r   r   r    r!   r   $   r"   zFalAIQueueTask.__init__r#   r$   r%   c                    r&   r'   r*   r-   r   r    r!   r+   '   r.   zFalAIQueueTask._prepare_headersr/   c                 C   s    | drd| dS d| S )Nr(   r0   z?_subdomain=queue)r,   r1   r    r    r!   r2   -   s   

zFalAIQueueTask._prepare_routeNresponserequest_paramsc                 C   s"  t |}|d}|std|d u rtd| j dt|j}|j d|j |jdkr/dnd }|jr<d	|j nd}t|d
j	}| t
| d| }	| t
| | }
|d}td |dkrtt t j|	|jd}t| | d}|dksit j|
|jd S )N
request_idz#No request ID found in the responsez7A `RequestParameters` object should be provided to get z responses with Fal AI.z://zrouter.huggingface.coz/fal-ai ?response_urlz/statusstatusz6Generating the output.. this can take several minutes.	COMPLETED)r#   )r   get
ValueErrorr   r   urlschemenetlocquerypathr6   loggerinfotimesleep_POLLING_INTERVALr   r#   r   json)r   r9   r:   response_dictr;   
parsed_urlr   query_parammodel_id
status_url
result_urlr?   status_responser    r    r!   get_response3   s.   

$


zFalAIQueueTask.get_responseN)r3   r4   r5   r6   r   r   r   r+   r2   r   bytesr   r
   rU   r7   r    r    r   r!   r8   #   s    "	
r8   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      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)	
isinstancer6   r,   openreadbase64	b64encodedecoder   )r   r]   r^   r_   ra   f	audio_b64content_typer    r    r!   _prepare_payload_as_dict]   s   

z<FalAIAutomaticSpeechRecognitionTask._prepare_payload_as_dictNr9   r:   c                 C   s.   t |d }t|tstdt| d|S )Ntextz>Unexpected output format from FalAI API. Expected string, got .)r   rb   r6   rB   type)r   r9   r:   rl   r    r    r!   rU   o   s   
z0FalAIAutomaticSpeechRecognitionTask.get_responserV   r3   r4   r5   r   r   r   r	   r   rk   r   rW   r
   rU   r7   r    r    r   r!   rY   Y   s    
,rY   c                	       rX   )FalAITextToImageTaskc                    rZ   )Nztext-to-imager   r[   r   r    r!   r   w   r\   zFalAITextToImageTask.__init__r]   r^   r_   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)rr   rs   
image_sizemainrepo_idrevisionfilename   rG   scaleloraszfal-ai/loraz(stabilityai/stable-diffusion-xl-base-1.0
model_name)r   popadapter_weights_pathr   HUGGINGFACE_CO_URL_TEMPLATEformathf_model_idprovider_id)r   r]   r^   r_   payload	lora_pathr    r    r!   rk   z   s$   


z-FalAITextToImageTask._prepare_payload_as_dictNr9   r:   c                 C   s"   t |d d d }t |jS Nimagesr   rC   r   r   rA   contentr   r9   r:   rC   r    r    r!   rU      s   z!FalAITextToImageTask.get_responserV   ro   r    r    r   r!   rp   v   s    
,rp   c                	       rX   )FalAITextToSpeechTaskc                    rZ   )Nztext-to-speechr   r[   r   r    r!   r      r\   zFalAITextToSpeechTask.__init__r]   r^   r_   r%   c                 C      d|it |S )Nrl   r   r   r]   r^   r_   r    r    r!   rk         z.FalAITextToSpeechTask._prepare_payload_as_dictNr9   r:   c                 C   s   t |d d }t |jS )NaudiorC   r   r   r    r    r!   rU      s   z"FalAITextToSpeechTask.get_responserV   ro   r    r    r   r!   r      s    
,r   c                	       d   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 fddZ  ZS )FalAITextToVideoTaskc                    rZ   )Nztext-to-videor   r[   r   r    r!   r      r\   zFalAITextToVideoTask.__init__r]   r^   r_   r%   c                 C   r   )Nrq   r   r   r    r    r!   rk      r   z-FalAITextToVideoTask._prepare_payload_as_dictNr9   r:   c                    ,   t  ||}t|d d }t |jS NvideorC   r   rU   r   r   rA   r   r   r9   r:   outputrC   r   r    r!   rU         z!FalAITextToVideoTask.get_responserV   ro   r    r    r   r!   r      s&    

r   c                	       r   )FalAIImageToImageTaskc                    rZ   )Nzimage-to-imager   r[   r   r    r!   r      r\   zFalAIImageToImageTask.__init__r]   r^   r_   r%   c                 C   sf   t |dd}d|v r|d|d< d|it|}|jd ur1tjj|jd|jd}|dd	g|d
< |S )N
image/jpegdefault_mime_typetarget_sizert   	image_urlru   rv   rz   r{   r}   )r   r   r   r   r   r   r   r   r   r]   r^   r_   r   r   r   r    r    r!   rk      s   
z.FalAIImageToImageTask._prepare_payload_as_dictNr9   r:   c                    s0   t  ||}t|d d d }t |jS r   r   r   r   r    r!   rU      s   z"FalAIImageToImageTask.get_responserV   ro   r    r    r   r!   r      s&    

r   c                	       r   )FalAIImageToVideoTaskc                    rZ   )Nzimage-to-videor   r[   r   r    r!   r      r\   zFalAIImageToVideoTask.__init__r]   r^   r_   r%   c                 C   sP   t |dd}d|it|}|jd ur&tjj|jd|jd}|ddg|d< |S )	Nr   r   r   ru   rv   rz   r{   r}   )r   r   r   r   r   r   r   r   r    r    r!   rk      s   
z.FalAIImageToVideoTask._prepare_payload_as_dictNr9   r:   c                    r   r   r   r   r   r    r!   rU      r   z"FalAIImageToVideoTask.get_responserV   ro   r    r    r   r!   r      s&    

r   )&re   rJ   abcr   typingr   r   r   r   urllib.parser   huggingface_hubr   huggingface_hub.hf_apir	   !huggingface_hub.inference._commonr
   r   r   ,huggingface_hub.inference._providers._commonr   r   huggingface_hub.utilsr   r   huggingface_hub.utils.loggingr   r3   rH   rL   r   r8   rY   rp   r   r   r   r   r    r    r    r!   <module>   s*    6#"