
    \j-                     n   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ee      Z G d dee      Z G d de      Z G d de      Z G d de      Z G d de      Z  G d de      Z! G d de      Z" G d de      Z#y)    N)ABC)Any)urlparse)	constants)InferenceProviderMapping)RequestParameters_as_dict_as_url)TaskProviderHelperfilter_none)get_sessionhf_raise_for_status)
get_loggerg      ?c                   Z     e Zd Zdef fdZdededeeef   f fdZdededefdZ xZ	S )		FalAITasktaskc                 *    t         |   dd|       y )Nfal-aizhttps://fal.runproviderbase_urlr   super__init__selfr   	__class__s     ^/root/.hermes/venv/lib/python3.12/site-packages/huggingface_hub/inference/_providers/fal_ai.pyr   zFalAITask.__init__   s    (5FTR    headersapi_keyreturnc                 Z    t         |   ||      }|j                  d      sd| |d<   |S Nhf_zKey authorizationr   _prepare_headers
startswithr   r    r!   r   s      r   r(   zFalAITask._prepare_headers   8    '*7G<!!%()-gY'7GO$r   mapped_modelc                     d| S )N/ r   r,   r!   s      r   _prepare_routezFalAITask._prepare_route   s    <.!!r   )
__name__
__module____qualname__strr   dictr   r(   r1   __classcell__r   s   @r   r   r      sM    SS S s tCH~ "3 " " "r   r   c                   ~     e Zd Zdef fdZdededeeef   f fdZdededefdZ	 dd
e	ez  de
d	z  defdZ xZS )FalAIQueueTaskr   c                 *    t         |   dd|       y )Nr   zhttps://queue.fal.runr   r   r   s     r   r   zFalAIQueueTask.__init__$   s    (5LSWXr   r    r!   r"   c                 Z    t         |   ||      }|j                  d      sd| |d<   |S r$   r'   r*   s      r   r(   zFalAIQueueTask._prepare_headers'   r+   r   r,   c                 :    |j                  d      rd| dS d| S )Nr%   r.   z?_subdomain=queue)r)   r0   s      r   r1   zFalAIQueueTask._prepare_route-   s-    e$|n$566<.!!r   Nresponserequest_paramsc                 p   t        |      }|j                  d      }|st        d      |t        d| j                   d      t	        |j
                        }|j                   d|j                   |j                  dk(  rdnd }|j                  rd	|j                   nd}t	        |j                  d
            j                  }| t        |       d| }	| t        |       | }
|j                  d      }t        j                  d       |dk7  rnt        j                  t               t!               j                  |	|j"                        }t%        |       |j'                         j                  d      }|dk7  rnt!               j                  |
|j"                        j'                         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pathr5   loggerinfotimesleep_POLLING_INTERVALr   r    r   json)r   r>   r?   response_dictrA   
parsed_urlr   query_parammodel_id
status_url
result_urlrE   status_responses                r   get_responsezFalAIQueueTask.get_response3   s   
 !*"&&|4
BCC!I$))Tkl 
 n001
 ''(J,=,=+>JL]L]axLxy  A  ?B  C0:0@0@***+,b M--n=>CC z#h-}E
 z#h->
""8,LM#JJ())m//
NDZDZ/[O0$))+//9F	 # }  ^5K5K LQQSSr   N)r2   r3   r4   r5   r   r6   r   r(   r1   bytesr   r[   r7   r8   s   @r   r:   r:   #   s    YS Y s tCH~ "3 " " " 48#T$,#T *D0#T 
	#Tr   r:   c            	       ^     e Zd Z fdZdededededz  fdZddeez  d	e	dz  defd
Z
 xZS )#FalAIAutomaticSpeechRecognitionTaskc                 $    t         |   d       y )Nzautomatic-speech-recognitionr   r   r   s    r   r   z,FalAIAutomaticSpeechRecognitionTask.__init__Z   s    78r   inputs
parametersprovider_mapping_infor"   Nc                 D   t        |t              r|j                  d      r|}nbt        |t              r%t        |d      5 }|j	                         }d d d        t        j                  |      j                         }d}d| d| }d|it        |      S # 1 sw Y   ExY w)N)zhttp://zhttps://rbz
audio/mpegdata:z;base64,	audio_url)	
isinstancer5   r)   openreadbase64	b64encodedecoder   )r   rb   rc   rd   rh   f	audio_b64content_types           r   _prepare_payload_as_dictz<FalAIAutomaticSpeechRecognitionTask._prepare_payload_as_dict]   s     fc"v'8'89P'QI &#&&$' &1VVXF& ((0779I'L~Xi[AIYB+j*ABB& &s   BBr>   r?   c                 v    t        |      d   }t        |t              st        dt	        |       d      d|iS )Ntextz>Unexpected output format from FalAI API. Expected string, got .)r	   ri   r5   rH   type)r   r>   r?   rt   s       r   r[   z0FalAIAutomaticSpeechRecognitionTask.get_responseo   sC    !&)$$]^bcg^h]iijkll~r   r\   r2   r3   r4   r   r   r6   r   rr   r]   r   r[   r7   r8   s   @r   r_   r_   Y   s\    9CC'+CD\C	C$UT\ CTW[C[ gj r   r_   c            	       ^     e Zd Z fdZdededededz  fdZddeez  d	e	dz  defd
Z
 xZS )FalAITextToImageTaskc                 $    t         |   d       y )Nztext-to-imager   ra   s    r   r   zFalAITextToImageTask.__init__w       )r   rb   rc   rd   r"   Nc                 >   d|it        |      }d|v r*d|v r&|j                  d      |j                  d      d|d<   |j                  St        j                  j                  |j                  d|j                        }|dd	g|d
<   |j                  dk(  rd|d<   |S )Npromptwidthheight)r~   r   
image_sizemainrepo_idrevisionfilename   rM   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   rb   rc   rd   payload	lora_paths         r   rr   z-FalAITextToImageTask._prepare_payload_as_dictz   s     f#
*%#
 g(g"5 W-!++h/%GL! !55A!==DD-99.CC E I
 *3Q ?@GG$00MA )S%r   r>   r?   c                 p    t        |      d   d   d   }t               j                  |      j                  S Nimagesr   rI   r	   r   rG   contentr   r>   r?   rI   s       r   r[   z!FalAITextToImageTask.get_response   s4    x *1-e4}  %---r   r\   rw   r8   s   @r   ry   ry   v   sW    *'+D\	4.UT\ .CTW[C[ .gj .r   ry   c            	       ^     e Zd Z fdZdededededz  fdZddeez  d	e	dz  defd
Z
 xZS )FalAITextToSpeechTaskc                 $    t         |   d       y )Nztext-to-speechr   ra   s    r   r   zFalAITextToSpeechTask.__init__       )*r   rb   rc   rd   r"   Nc                      d|it        |      S )Nrt   r   r   rb   rc   rd   s       r   rr   z.FalAITextToSpeechTask._prepare_payload_as_dict   s     :+j"9::r   r>   r?   c                 j    t        |      d   d   }t               j                  |      j                  S )NaudiorI   r   r   s       r   r[   z"FalAITextToSpeechTask.get_response   s/    x )%0}  %---r   r\   rw   r8   s   @r   r   r      sW    +;;'+;D\;	;
.UT\ .CTW[C[ .gj .r   r   c            	       d     e Zd Z fdZdededededz  fdZ	 ddeez  d	e	dz  def fd
Z
 xZS )FalAITextToVideoTaskc                 $    t         |   d       y )Nztext-to-videor   ra   s    r   r   zFalAITextToVideoTask.__init__   r{   r   rb   rc   rd   r"   Nc                      d|it        |      S )Nr}   r   r   s       r   rr   z-FalAITextToVideoTask._prepare_payload_as_dict   s     &<K
$;<<r   r>   r?   c                     t         |   ||      }t        |      d   d   }t               j	                  |      j
                  S NvideorI   r   r[   r	   r   rG   r   r   r>   r?   outputrI   r   s        r   r[   z!FalAITextToVideoTask.get_response   C    
 %h?vw'.}  %---r   r\   rw   r8   s   @r   r   r      se    *=='+=D\=	= 48.$,. *D0. 
	. .r   r   c            	       d     e Zd Z fdZdededededz  fdZ	 ddeez  d	e	dz  def fd
Z
 xZS )FalAIImageToImageTaskc                 $    t         |   d       y )Nzimage-to-imager   ra   s    r   r   zFalAIImageToImageTask.__init__   r   r   rb   rc   rd   r"   Nc                    t        |d      }d|v r|j                  d      |d<   ||gdt        |      }|j                  ?t        j
                  j                  |j                  d|j                        }|dd	g|d
<   |S )N
image/jpegdefault_mime_typetarget_sizer   )	image_url
image_urlsr   r   r   r   r   )r
   r   r   r   r   r   r   r   r   rb   rc   rd   r   r   r   s          r   rr   z.FalAIImageToImageTask._prepare_payload_as_dict   s     FlC	J&'1~~m'DJ|$"$+#
 *%#

 !55A!==DD-99.CC E I
 *3Q ?@GGr   r>   r?   c                     t         |   ||      }t        |      d   d   d   }t               j	                  |      j
                  S r   r   r   s        r   r[   z"FalAIImageToImageTask.get_response   sH    
 %h?vx(+E2}  %---r   r\   rw   r8   s   @r   r   r      se    +'+D\	0 48.$,. *D0. 
	. .r   r   c            	       d     e Zd Z fdZdededededz  fdZ	 ddeez  d	e	dz  def fd
Z
 xZS )FalAIImageToVideoTaskc                 $    t         |   d       y )Nzimage-to-videor   ra   s    r   r   zFalAIImageToVideoTask.__init__   r   r   rb   rc   rd   r"   Nc                     t        |d      }d|it        |      }|j                  ?t        j                  j                  |j                  d|j                        }|ddg|d<   |S )	Nr   r   r   r   r   r   r   r   )r
   r   r   r   r   r   r   r   s          r   rr   z.FalAIImageToVideoTask._prepare_payload_as_dict   s     FlC	#
*%#
 !55A!==DD-99.CC E I
 *3Q ?@GGr   r>   r?   c                     t         |   ||      }t        |      d   d   }t               j	                  |      j
                  S r   r   r   s        r   r[   z"FalAIImageToVideoTask.get_response   r   r   r\   rw   r8   s   @r   r   r      se    +'+D\	( 48.$,. *D0. 
	. .r   r   c            	       d     e Zd Z fdZdededededz  fdZ	 ddeez  d	e	dz  def fd
Z
 xZS )FalAIImageSegmentationTaskc                 $    t         |   d       y )Nzimage-segmentationr   ra   s    r   r   z#FalAIImageSegmentationTask.__init__   s    -.r   rb   rc   rd   r"   Nc                 F    t        |d      }d|it        |      ddi}|S )Nz	image/pngr   r   	sync_modeT)r
   r   )r   rb   rc   rd   r   r   s         r   rr   z3FalAIImageSegmentationTask._prepare_payload_as_dict   s<     FkB	#
*%#
 #

 r   r>   r?   c                    t         	|   ||      }t        |      }d|vrt        d|       |d   }d|vrt        d|       |d   }t	        |t
              r9|j                  d      r(d|v r|j                  dd      d   }n_t        d|       t               j                  |      }t        |       t        j                  |j                        j                         }d	|d
gS )NimagezGResponse from fal ai image-segmentation API does not contain an image: rI   zFImage data from fal ai image-segmentation API does not contain a URL: rg   ,r   zInvalid data URL format: mask)labelr   )r   r[   r	   rH   ri   r5   r)   splitr   rG   r   rl   rm   r   rn   )
r   r>   r?   resultresult_dict
image_datar   mask_base64mask_responser   s
            r   r[   z'FalAIImageSegmentationTask.get_response  s   
 %h?v&+%fgrfstuu )

"efpeqrssu%	i%)*>*>w*Gi'ooc15a8 #<YK!HII (M--i8M. **=+@+@AHHJK  #
 	
r   r\   rw   r8   s   @r   r   r      se    /		'+	D\			 48!
$,!
 *D0!
 
	!
 !
r   r   )$rl   rP   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   r2   rN   rR   r   r:   r_   ry   r   r   r   r   r   r/   r   r   <module>r      s        ! % ; R R X B 4 
H	  ""C "3T' 3Tl) : .9  .F.I ..> .& .N  .F.N .>0
 0
r   