
    qi'.                     v   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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OptionalUnion)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     ]/opt/pipecat/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*   r3   __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
ef   d
ee   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'   r0   z?_subdomain=queue)r+   r2   s      r    r3   zFalAIQueueTask._prepare_route-   s-    e$|n$566<.!!r!   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pathr7   loggerinfotimesleep_POLLING_INTERVALr   r"   r   json)r   r@   rA   response_dictrC   
parsed_urlr   query_parammodel_id
status_url
result_urlrG   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)r4   r5   r6   r7   r   r8   r   r*   r3   r   bytesr   r
   r]   r9   r:   s   @r    r<   r<   #   s    YS Y s tCH~ "3 " " " 7;#Tt$#T !!23#T 
	#Tr!   r<   c            	       b     e Zd Z fdZdedededee   fdZd
de	e
ef   dee   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$   c                 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)	
isinstancer7   r+   openreadbase64	b64encodedecoder   )r   rd   re   rf   rj   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@   rA   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   rk   r7   rJ   type)r   r@   rA   rv   s       r    r]   z0FalAIAutomaticSpeechRecognitionTask.get_responseo   sC    !&)$$]^bcg^h]iijkll~r!   r^   r4   r5   r6   r   r   r8   r	   r   rt   r   r_   r
   r]   r9   r:   s   @r    ra   ra   Y   s`    9CC'+CD\C	$C$U5$;%7 RcId ps r!   ra   c            	       b     e Zd Z fdZdedededee   fdZd
de	e
ef   dee   defd	Z xZS )FalAITextToImageTaskc                 $    t         |   d       y )Nztext-to-imager   rc   s    r    r   zFalAITextToImageTask.__init__w       )r!   rd   re   rf   r$   c                 >   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   rO   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   rd   re   rf   payload	lora_paths         r    rt   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@   rA   c                 p    t        |      d   d   d   }t               j                  |      j                  S Nimagesr   rK   r   r   rI   contentr   r@   rA   rK   s       r    r]   z!FalAITextToImageTask.get_response   s4    x *1-e4}  %---r!   r^   ry   r:   s   @r    r{   r{   v   s[    *'+D\	$4.U5$;%7 .RcId .ps .r!   r{   c            	       b     e Zd Z fdZdedededee   fdZd
de	e
ef   dee   defd	Z xZS )FalAITextToSpeechTaskc                 $    t         |   d       y )Nztext-to-speechr   rc   s    r    r   zFalAITextToSpeechTask.__init__       )*r!   rd   re   rf   r$   c                      d|it        |      S )Nrv   r   r   rd   re   rf   s       r    rt   z.FalAITextToSpeechTask._prepare_payload_as_dict   s     :+j"9::r!   r@   rA   c                 j    t        |      d   d   }t               j                  |      j                  S )NaudiorK   r   r   s       r    r]   z"FalAITextToSpeechTask.get_response   s/    x )%0}  %---r!   r^   ry   r:   s   @r    r   r      s[    +;;'+;D\;	$;
.U5$;%7 .RcId .ps .r!   r   c            	       h     e Zd Z fdZdedededee   fdZ	 d
de	e
ef   dee   def fd	Z xZS )FalAITextToVideoTaskc                 $    t         |   d       y )Nztext-to-videor   rc   s    r    r   zFalAITextToVideoTask.__init__   r}   r!   rd   re   rf   r$   c                      d|it        |      S )Nr   r   r   s       r    rt   z-FalAITextToVideoTask._prepare_payload_as_dict   s     &<K
$;<<r!   r@   rA   c                     t         |   ||      }t        |      d   d   }t               j	                  |      j
                  S NvideorK   r   r]   r   r   rI   r   r   r@   rA   outputrK   r   s        r    r]   z!FalAITextToVideoTask.get_response   C    
 %h?vw'.}  %---r!   r^   ry   r:   s   @r    r   r      sk    *=='+=D\=	$= 7;.t$. !!23. 
	. .r!   r   c            	       h     e Zd Z fdZdedededee   fdZ	 d
de	e
ef   dee   def fd	Z xZS )FalAIImageToImageTaskc                 $    t         |   d       y )Nzimage-to-imager   rc   s    r    r   zFalAIImageToImageTask.__init__   r   r!   rd   re   rf   r$   c                    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   rd   re   rf   r   r   r   s          r    rt   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@   rA   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^   ry   r:   s   @r    r   r      sk    +'+D\	$0 7;.t$. !!23. 
	. .r!   r   c            	       h     e Zd Z fdZdedededee   fdZ	 d
de	e
ef   dee   def fd	Z xZS )FalAIImageToVideoTaskc                 $    t         |   d       y )Nzimage-to-videor   rc   s    r    r   zFalAIImageToVideoTask.__init__   r   r!   rd   re   rf   r$   c                     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    rt   z.FalAIImageToVideoTask._prepare_payload_as_dict   s     FlC	#
*%#
 !55A!==DD-99.CC E I
 *3Q ?@GGr!   r@   rA   c                     t         |   ||      }t        |      d   d   }t               j	                  |      j
                  S r   r   r   s        r    r]   z"FalAIImageToVideoTask.get_response   r   r!   r^   ry   r:   s   @r    r   r      sk    +'+D\	$( 7;.t$. !!23. 
	. .r!   r   c            	       h     e Zd Z fdZdedededee   fdZ	 d
de	e
ef   dee   def fd	Z xZS )FalAIImageSegmentationTaskc                 $    t         |   d       y )Nzimage-segmentationr   rc   s    r    r   z#FalAIImageSegmentationTask.__init__   s    -.r!   rd   re   rf   r$   c                 F    t        |d      }d|it        |      ddi}|S )Nz	image/pngr   r   	sync_modeT)r   r   )r   rd   re   rf   r   r   s         r    rt   z3FalAIImageSegmentationTask._prepare_payload_as_dict   s<     FkB	#
*%#
 #

 r!   r@   rA   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: rK   zFImage data from fal ai image-segmentation API does not contain a URL: ri   ,r   zInvalid data URL format: mask)labelr   )r   r]   r   rJ   rk   r7   r+   splitr   rI   r   rn   ro   r   rp   )
r   r@   rA   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^   ry   r:   s   @r    r   r      sk    /		'+	D\		$	 7;!
t$!
 !!23!
 
	!
 !
r!   r   )&rn   rR   abcr   typingr   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   r4   rP   rT   r   r<   ra   r{   r   r   r   r   r   r1   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!   