o
     
j-                     @   s0  d dl 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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)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/kuhnn/.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   dictr   r(   r/   __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B de
dB 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)   r.   r   r   r   r/   -   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pathr3   loggerinfotimesleep_POLLING_INTERVALr   r    r   json)r   r7   r8   response_dictr9   
parsed_urlr   query_parammodel_id
status_url
result_urlr=   status_responser   r   r   get_response3   s.   

$


zFalAIQueueTask.get_responseN)r0   r1   r2   r3   r   r4   r   r(   r/   bytesr   rS   r5   r   r   r   r   r6   #   s    "	r6   c                	       Z   e Zd Z fddZdededededB fdd	Zdd
eeB de	dB 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"   Nc                 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)	
isinstancer3   r)   openreadbase64	b64encodedecoder   )r   r[   r\   r]   r`   f	audio_b64content_typer   r   r   _prepare_payload_as_dict]   s   

z<FalAIAutomaticSpeechRecognitionTask._prepare_payload_as_dictr7   r8   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   ra   r3   r@   type)r   r7   r8   rk   r   r   r   rS   o   s   
z0FalAIAutomaticSpeechRecognitionTask.get_responserT   r0   r1   r2   r   r   r4   r   rj   rU   r   rS   r5   r   r   r   r   rW   Y   s    
(rW   c                	       rV   )FalAITextToImageTaskc                    rX   )Nztext-to-imager   rY   r   r   r   r   w   rZ   zFalAITextToImageTask.__init__r[   r\   r]   r"   Nc                 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)rq   rr   
image_sizemainrepo_idrevisionfilename   rE   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   rj   z   s$   


z-FalAITextToImageTask._prepare_payload_as_dictr7   r8   c                 C   s"   t |d d d }t |jS Nimagesr   rA   r   r   r?   contentr   r7   r8   rA   r   r   r   rS      s   z!FalAITextToImageTask.get_responserT   rn   r   r   r   r   ro   v   s    
(ro   c                	       rV   )FalAITextToSpeechTaskc                    rX   )Nztext-to-speechr   rY   r   r   r   r      rZ   zFalAITextToSpeechTask.__init__r[   r\   r]   r"   Nc                 C      d|it |S )Nrk   r   r   r[   r\   r]   r   r   r   rj         z.FalAITextToSpeechTask._prepare_payload_as_dictr7   r8   c                 C   s   t |d d }t |jS )NaudiorA   r   r   r   r   r   rS      s   z"FalAITextToSpeechTask.get_responserT   rn   r   r   r   r   r      s    
(r   c                	       `   e Zd Z fddZdededededB fdd	Z	dd
eeB de	dB def fddZ
  ZS )FalAITextToVideoTaskc                    rX   )Nztext-to-videor   rY   r   r   r   r      rZ   zFalAITextToVideoTask.__init__r[   r\   r]   r"   Nc                 C   r   )Nrp   r   r   r   r   r   rj      r   z-FalAITextToVideoTask._prepare_payload_as_dictr7   r8   c                    ,   t  ||}t|d d }t |jS NvideorA   r   rS   r   r   r?   r   r   r7   r8   outputrA   r   r   r   rS         z!FalAITextToVideoTask.get_responserT   rn   r   r   r   r   r      s&    
r   c                	       r   )FalAIImageToImageTaskc                    rX   )Nzimage-to-imager   rY   r   r   r   r      rZ   zFalAIImageToImageTask.__init__r[   r\   r]   r"   Nc                 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default_mime_typetarget_sizers   )	image_url
image_urlsrt   ru   ry   rz   r|   )r	   r~   r   r   r   r   r   r   r   r[   r\   r]   r   r   r   r   r   r   rj      s    
z.FalAIImageToImageTask._prepare_payload_as_dictr7   r8   c                    s0   t  ||}t|d d d }t |jS r   r   r   r   r   r   rS      s   z"FalAIImageToImageTask.get_responserT   rn   r   r   r   r   r      s&    
r   c                	       r   )FalAIImageToVideoTaskc                    rX   )Nzimage-to-videor   rY   r   r   r   r      rZ   zFalAIImageToVideoTask.__init__r[   r\   r]   r"   Nc                 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   rt   ru   ry   rz   r|   )r	   r   r   r   r   r   r   r   r   r   r   rj      s   
z.FalAIImageToVideoTask._prepare_payload_as_dictr7   r8   c                    r   r   r   r   r   r   r   rS      r   z"FalAIImageToVideoTask.get_responserT   rn   r   r   r   r   r      s&    
r   c                	       r   )FalAIImageSegmentationTaskc                    rX   )Nzimage-segmentationr   rY   r   r   r   r      rZ   z#FalAIImageSegmentationTask.__init__r[   r\   r]   r"   Nc                 C   s(   t |dd}d|it|ddi}|S )Nz	image/pngr   r   	sync_modeT)r	   r   )r   r[   r\   r]   r   r   r   r   r   rj      s   z3FalAIImageSegmentationTask._prepare_payload_as_dictr7   r8   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: r_   ,ry   zInvalid data URL format: mask)labelr   )r   rS   r   r@   ra   r3   r)   splitr   r?   r   rd   re   r   rf   )	r   r7   r8   resultresult_dict
image_datar   mask_base64mask_responser   r   r   rS     s&   z'FalAIImageSegmentationTask.get_responserT   rn   r   r   r   r   r      s&    
r   )$rd   rH   abcr   typingr   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   r0   rF   rJ   r   r6   rW   ro   r   r   r   r   r   r   r   r   r   <module>   s,    6##