o
    0i'.                     @   s8  d dl Z d dlZd dlmZ d dl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$G dd deZ%dS )    N)ABC)Any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__ e/home/kim/smarthome/.venv/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   dictr   r*   r1   __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'   r/   z?_subdomain=queue)r+   r0   r   r   r    r1   -   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 ?Zresponse_urlz/statusstatusz6Generating the output.. this can take several minutes.Z	COMPLETED)r"   )r
   get
ValueErrorr   r   urlschemenetlocquerypathr5   loggerinfotimesleep_POLLING_INTERVALr   r"   r   json)r   r9   r:   Zresponse_dictr;   
parsed_urlr   Zquery_paramZmodel_idZ
status_urlZ
result_urlr>   Zstatus_responser   r   r    get_response3   s.   

$


zFalAIQueueTask.get_responseN)r2   r3   r4   r5   r   r6   r   r*   r1   r   bytesr   r	   rM   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/mpegdata:z;base64,	audio_url)	
isinstancer5   r+   openreadbase64	b64encodedecoder   )r   rU   rV   rW   rZ   fZ	audio_b64content_typer   r   r    _prepare_payload_as_dict]   s   

z<FalAIAutomaticSpeechRecognitionTask._prepare_payload_as_dictNr9   r:   c                 C   s2   t |d }t|tstdt| dd|iS )Ntextz>Unexpected output format from FalAI API. Expected string, got .)r
   r[   r5   r@   type)r   r9   r:   rd   r   r   r    rM   o   s   
z0FalAIAutomaticSpeechRecognitionTask.get_responserN   r2   r3   r4   r   r   r6   r   r   rc   r   rO   r	   rM   r7   r   r   r   r    rQ   Y   s    
,rQ   c                	       rP   )FalAITextToImageTaskc                    rR   )Nztext-to-imager   rS   r   r   r    r   w   rT   zFalAITextToImageTask.__init__rU   rV   rW   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)rj   rk   
image_sizemainZrepo_idrevisionfilename   rE   scaleloraszfal-ai/loraz(stabilityai/stable-diffusion-xl-base-1.0Z
model_name)r   popadapter_weights_pathr   HUGGINGFACE_CO_URL_TEMPLATEformathf_model_idZprovider_id)r   rU   rV   rW   payload	lora_pathr   r   r    rc   z   s$   


z-FalAITextToImageTask._prepare_payload_as_dictNr9   r:   c                 C   s"   t |d d d }t |jS NZimagesr   rA   r
   r   r?   contentr   r9   r:   rA   r   r   r    rM      s   z!FalAITextToImageTask.get_responserN   rg   r   r   r   r    rh   v   s    
,rh   c                	       rP   )FalAITextToSpeechTaskc                    rR   )Nztext-to-speechr   rS   r   r   r    r      rT   zFalAITextToSpeechTask.__init__rU   rV   rW   r$   c                 C      d|it |S )Nrd   r   r   rU   rV   rW   r   r   r    rc         z.FalAITextToSpeechTask._prepare_payload_as_dictNr9   r:   c                 C   s   t |d d }t |jS )NZaudiorA   r}   r   r   r   r    rM      s   z"FalAITextToSpeechTask.get_responserN   rg   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                    rR   )Nztext-to-videor   rS   r   r   r    r      rT   zFalAITextToVideoTask.__init__rU   rV   rW   r$   c                 C   r   )Nri   r   r   r   r   r    rc      r   z-FalAITextToVideoTask._prepare_payload_as_dictNr9   r:   c                    ,   t  ||}t|d d }t |jS NZvideorA   r   rM   r
   r   r?   r~   r   r9   r:   outputrA   r   r   r    rM         z!FalAITextToVideoTask.get_responserN   rg   r   r   r   r    r      s&    

r   c                	       r   )FalAIImageToImageTaskc                    rR   )Nzimage-to-imager   rS   r   r   r    r      rT   zFalAIImageToImageTask.__init__rU   rV   rW   r$   c                 C   sj   t |dd}d|v r|d|d< ||gdt|}|jd ur3tjj|jd|jd}|dd	g|d
< |S )N
image/jpegZdefault_mime_typeZtarget_sizerl   )	image_urlZ
image_urlsrm   rn   rq   rr   rt   )r   ru   r   rv   r   rw   rx   ry   r   rU   rV   rW   r   rz   r{   r   r   r    rc      s    
z.FalAIImageToImageTask._prepare_payload_as_dictNr9   r:   c                    s0   t  ||}t|d d d }t |jS r|   r   r   r   r   r    rM      s   z"FalAIImageToImageTask.get_responserN   rg   r   r   r   r    r      s&    

r   c                	       r   )FalAIImageToVideoTaskc                    rR   )Nzimage-to-videor   rS   r   r   r    r      rT   zFalAIImageToVideoTask.__init__rU   rV   rW   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   rm   rn   rq   rr   rt   )r   r   rv   r   rw   rx   ry   r   r   r   r    rc      s   
z.FalAIImageToVideoTask._prepare_payload_as_dictNr9   r:   c                    r   r   r   r   r   r   r    rM      r   z"FalAIImageToVideoTask.get_responserN   rg   r   r   r   r    r      s&    

r   c                	       r   )FalAIImageSegmentationTaskc                    rR   )Nzimage-segmentationr   rS   r   r   r    r      rT   z#FalAIImageSegmentationTask.__init__rU   rV   rW   r$   c                 C   s(   t |dd}d|it|ddi}|S )Nz	image/pngr   r   Z	sync_modeT)r   r   )r   rU   rV   rW   r   rz   r   r   r    rc      s   z3FalAIImageSegmentationTask._prepare_payload_as_dictNr9   r:   c           	         s   t  ||}t|}d|vrtd| |d }d|vr%td| |d }t|trG|drGd|v r@|ddd }ntd| t 	|}t
| t|j }d	|d
gS )NimagezGResponse from fal ai image-segmentation API does not contain an image: rA   zFImage data from fal ai image-segmentation API does not contain a URL: rY   ,rq   zInvalid data URL format: mask)labelr   )r   rM   r
   r@   r[   r5   r+   splitr   r?   r   r^   r_   r~   r`   )	r   r9   r:   resultZresult_dictZ
image_datar   Zmask_base64Zmask_responser   r   r    rM     s&   z'FalAIImageSegmentationTask.get_responserN   rg   r   r   r   r    r      s&    

r   )&r^   rH   abcr   typingr   r   r   urllib.parser   Zhuggingface_hubr   Zhuggingface_hub.hf_apir   Z!huggingface_hub.inference._commonr	   r
   r   Z,huggingface_hub.inference._providers._commonr   r   Zhuggingface_hub.utilsr   r   Zhuggingface_hub.utils.loggingr   r2   rF   rJ   r   r8   rQ   rh   r   r   r   r   r   r   r   r   r    <module>   s,    6##