o
    yiq5                    @  s  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ d dlmZmZ d dlmZmZ d dlmZmZ d dlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d d	l(m)Z) d dl*Z*d dl+Z+d d
l,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= e#rd dl>m?Z? d dl@mAZA eBeCZDe#rd dlEmFZF e!eGef ZHe%d ZIde2 dZJde1 dZKde2 dZLdZMdZNejOPddZQdZRdeSd< ddgZTdeSd< d e6 d!ZUd"ZVejWjXd#d$ZYeG d%d& d&ZZG d'd( d(Z[G d)d* d*Z\d+Z]d,Z^d-Z_G d.d/ d/Z`G d0d1 d1ZaG d2d3 d3ebZceG d4d5 d5ecZdeG d6d7 d7eceeZfdd<d=ZgeG d>d? d?ZheG d@dA dAehZieG dBdC dCehZjeG dDdE dEehZkedFdGG dHdI dIZldJdKgZmddNdOZnedFdGG dPdQ dQZodRZpdSZqdTZrddVdWZsdd[d\Ztd]dd^ddcddZudedfddgdhZvddkdlZwG dmdn dnexZyddqdrZzddsdtZ{d dxdyZ|dd}d~Z}eG dd dZ~eG dd dZe	ddddZe	ddddZdddZdddZd-ZdZdZg dZg dZe+jdddZdddZg fdddZg fd	ddZ		d
dddZg ddddZg ddddZdddZdddZdddZdddȄZdddʄZddd̄Zddd΄ZdddЄZddd҄ZdddԄZdddքZdddڄZddd݄ZdddZdddZedFdGG dd߄ delZedFdGG dd delZedFdGG dd dZedFdGG dd dZdddZdddZddddZdS (      )annotationsN)Path)asynccontextmanagercontextmanager)datetimetimezone)	dataclassfield)cached_propertypartial)
AnyAsyncIterator	AwaitableDictIteratorTYPE_CHECKINGOptionalLiteralCallableUnion)	urlencode)aconnect_sseconnect_sse)AuthCredentialsFAL_QUEUE_RUN_HOSTFAL_RUN_HOSTMissingCredentialsErrorfetch_auth_credentials)__version__)Priorityadd_priority_headeradd_timeout_headeradd_hint_headerREQUEST_TIMEOUT_TYPE_HEADERREQUEST_TIMEOUT_HEADER)WebSocketClientProtocol)
Connection)Image)fal_v3cdnfalzhttps:///zwss://zhttps://rest.fal.aizhttps://v3.fal.mediaFAL_CDN_HOSTzhttps://fal.mediar(   UploadRepositoryIdDEFAULT_UPLOAD_REPOSITORYr)   r*   list[UploadRepositoryId]"DEFAULT_UPLOAD_FALLBACK_REPOSITORYzfal-client/z	 (python)   FAL_CLIENT_EXECUTOR)thread_name_prefixc                   @  s8   e Zd ZU ded< ded< ded< ded< dd	d
ZdS )CDNTokenstrtoken
token_typebase_upload_urlr   
expires_atreturnboolc                 C  s   t tj| jkS N)r   nowr   utcr9   self rA   I/home/livre-enfant/venv/lib/python3.10/site-packages/fal_client/client.py
is_expired]   s   zCDNToken.is_expiredN)r:   r;   )__name__
__module____qualname____annotations__rC   rA   rA   rA   rB   r4   V   s   
 r4   c                   @  *   e Zd ZdddZddd	Zdd
dZdS )CDNTokenManagerauthr   r:   Nonec                 C  P   || _ tdddtjjtjdd| _t	 | _
t d| _| j jddd| _d S N )tzinfor6   r7   r8   r9   z+/storage/auth/token?storage_type=fal-cdn-v3application/jsonAuthorizationAcceptContent-Type)_authr4   r   minreplacer   r>   _token	threadingLock_lockREST_URL_urlheader_value_headersr@   rJ   rA   rA   rB   __init__b      
zCDNTokenManager.__init__r4   c                 C  sr   t  }|j| j| ji d}|  | }W d    n1 s!w   Y  t|d |d |d t	|d dS Nheadersjsonr6   r7   base_urlr9   rP   )
httpxClientpostr^   r`   raise_for_statusrg   r4   r   fromisoformatr@   clientresponsedatarA   rA   rB   _refresh_tokenr   s   

zCDNTokenManager._refresh_tokenc                 C  sD   | j  | j r|  | _| jW  d    S 1 sw   Y  d S r<   r\   rY   rC   rr   r?   rA   rA   rB   	get_token   s
   

$zCDNTokenManager.get_tokenNrJ   r   r:   rK   r:   r4   rD   rE   rF   rb   rr   rt   rA   rA   rA   rB   rI   a       

rI   c                   @  rH   )AsyncCDNTokenManagerrJ   r   r:   rK   c                 C  rL   rM   )rV   r4   r   rW   rX   r   r>   rY   asyncior[   r\   r]   r^   r_   r`   ra   rA   rA   rB   rb      rc   zAsyncCDNTokenManager.__init__r4   c              	     s   t  4 I d H  }|j| j| ji dI d H }|  | }W d   I d H  n1 I d H s/w   Y  t|d |d |d t	|d dS rd   )
ri   AsyncClientrk   r^   r`   rl   rg   r4   r   rm   rn   rA   rA   rB   rr      s   
(z#AsyncCDNTokenManager._refresh_tokenc              	     s`   | j 4 I d H  | j r|  I d H | _| jW  d   I d H  S 1 I d H s)w   Y  d S r<   rs   r?   rA   rA   rB   rt      s   
0zAsyncCDNTokenManager.get_tokenNru   rv   rw   rA   rA   rA   rB   ry      rx   ry   i  @i   
   c                   @     e Zd Zddddd*ddZed+ddZed+ddZed,ddZdd Zd-dd Z	d+d!d"Z
edddd#d.d$d%Zeddddd/d(d)ZdS )0MultipartUploadN
chunk_sizecontent_typemax_concurrency	file_namer5   ro   httpx.Clienttoken_managerrI   r   
int | Noner   
str | Noner   r:   rK   c                C  F   || _ || _|| _|pt| _|pd| _|pt| _d | _d | _	g | _
d S Napplication/octet-streamr   _client_token_managerMULTIPART_CHUNK_SIZEr   r   MULTIPART_MAX_CONCURRENCYr   _access_url
_upload_id_partsr@   r   ro   r   r   r   r   rA   rA   rB   rb         




zMultipartUpload.__init__c                 C     | j std| j S NzUpload not initiatedr   
ValueErrorr?   rA   rA   rB   
access_url      zMultipartUpload.access_urlc                 C  r   r   r   r   r?   rA   rA   rB   	upload_id   r   zMultipartUpload.upload_iddict[str, str]c                 C  s"   | j  }|j d|j ddS N z	fal/0.1.0rS   z
User-Agentr   rt   r7   r6   r@   r6   rA   rA   rB   auth_headers   s   
zMultipartUpload.auth_headersc              	   C  s^   | j  }|j d}t| jd|i | jd| j| jdd}| }|d | _	|d | _
d S Nz/files/upload/multipartPOSTrQ   )rT   rU   X-Fal-File-Namerf   r   uploadId)r   rt   r8   _maybe_retry_requestr   r   r   r   rg   r   r   )r@   r6   urlrp   resultrA   rA   rB   create   s"   

zMultipartUpload.createpart_numberintrq   bytesc                 C  s`   | j  d| j d| }t| jd|i | j| jdd|d d}|jd }| j||d d S 	N/multipart/r+   PUTidentity)rU   zAccept-Encoding)rf   contenttimeoutetag)
partNumberr   )	r   r   _requestr   r   r   rf   r   append)r@   r   rq   r   rp   r   rA   rA   rB   upload_part   s(   
zMultipartUpload.upload_partc                 C  s6   | j  d| j d}t| jd|| jd| jid | j S Nr   z	/completer   partsre   )r   r   r   r   r   r   )r@   r   rA   rA   rB   complete  s   zMultipartUpload.completer   r   r   c             	   C  s   dd l }| ||||||d}	|	  tt||	j }
|jj|	jd?}g }t	d|
d D ]}|d |	j }||||	j  }|
||	j|| q.|j|D ]}|  qRW d    |	 S 1 sfw   Y  |	 S )Nr   r   ro   r   r   r   r   max_workersr1   )concurrent.futuresr   mathceillenr   futuresThreadPoolExecutorr   ranger   submitr   as_completedr   r   )clsro   r   r   rq   r   r   r   
concurrent	multipartr   executorr   r   startfuturerA   rA   rB   save  s:   

zMultipartUpload.save	file_path
str | Pathc                  s   dd l }tj }tj }	| ||||||d  t|	j }
|j	j
jd5}g }td|
d D ]}d fd	d
}|||| q8|j	|D ]}|  qRW d     S 1 sfw   Y   S )Nr   r   r   r1   pnr   r:   rK   c                   s`   t  d!}| d j }|| |j}| | W d    d S 1 s)w   Y  d S Nrbr1   openr   seekreadr   )r   fr   rq   r   r   rA   rB   _upload_partS  s   
"z/MultipartUpload.save_file.<locals>._upload_part)r   r   r:   rK   )r   ospathbasenamegetsizer   r   r   r   r   r   r   r   r   r   r   r   r   )r   ro   r   r   r   r   r   r   r   sizer   r   r   r   r   r   rA   r   rB   	save_file4  s8   

zMultipartUpload.save_file)r   r5   ro   r   r   rI   r   r   r   r   r   r   r:   rK   r:   r5   r:   r   r   r   rq   r   r:   rK   )ro   r   r   rI   r   r5   rq   r   r   r   r   r   r   r   )ro   r   r   rI   r   r   r   r   r   r   r   r   r:   r5   rD   rE   rF   rb   propertyr   r   r   r   r   r   classmethodr   r   rA   rA   rA   rB   r~      s0    

%r~   c                   @  r}   )0AsyncMultipartUploadNr   r   r5   ro   httpx.AsyncClientr   ry   r   r   r   r   r   r:   rK   c                C  r   r   r   r   rA   rA   rB   rb   a  r   zAsyncMultipartUpload.__init__c                 C  r   r   r   r?   rA   rA   rB   r   u  r   zAsyncMultipartUpload.access_urlc                 C  r   r   r   r?   rA   rA   rB   r   {  r   zAsyncMultipartUpload.upload_idr   c                   s*   | j  I d H }|j d|j ddS r   r   r   rA   rA   rB   r     s
   z!AsyncMultipartUpload.auth_headersc              	     sv   | j  I d H }|j d}| jI d H }t| jd|i |d| j| jddI d H }| }|d | _	|d | _
d S r   )r   rt   r8   r   _async_maybe_retry_requestr   r   r   rg   r   r   )r@   r6   r   rf   rp   r   rA   rA   rB   r     s&   
zAsyncMultipartUpload.creater   r   rq   r   c                   sr   | j  d| j d| }| jI d H }t| jd|i || jdd|d dI d H }|jd }| j||d d S r   )	r   r   r   _async_requestr   r   rf   r   r   )r@   r   rq   r   rf   rp   r   rA   rA   rB   r     s,   
z AsyncMultipartUpload.upload_partc                   sH   | j  d| j d}| jI d H }t| jd||d| jidI d H  | j S r   )r   r   r   r   r   r   )r@   r   rf   rA   rA   rB   r     s   zAsyncMultipartUpload.completer   c          
        s   | ||||||d  I d H  ttj }dfddfdd	td
|d
 D }	tjfdd tj	 fdd	|	D  I d H  
 I d H S )Nr   r   r   r:   rK   c                   s8   | d j  } ||j   }| |I d H  d S )Nr1   )r   r   )r   r   chunk)rq   r   rA   rB   r     s   z.AsyncMultipartUpload.save.<locals>.upload_partc                      g | ]	}t  |qS rA   rz   create_task.0r   r   rA   rB   
<listcomp>      z-AsyncMultipartUpload.save.<locals>.<listcomp>r1   c              	     J    4 I d H  | I d H  W d   I d H  d S 1 I d H sw   Y  d S r<   rA   tasksemrA   rB   bounded_upload     .z1AsyncMultipartUpload.save.<locals>.bounded_uploadc                      g | ]} |qS rA   rA   r   r   r   rA   rB   r         r   r   r:   rK   )r   r   r   r   r   r   rz   	Semaphorer   gatherr   )
r   ro   r   r   rq   r   r   r   r   tasksrA   )r   rq   r   r   r   rB   r     s&   
zAsyncMultipartUpload.saver   r   c                  s   t j}t j}| ||||||d I d H  t|j }	dfddfdd	td
|	d
 D }
t	
jfdd t	j fdd	|
D  I d H   I d H S )Nr   r   r   r:   rK   c                   sh   t  d$}| d j }|| |j}| |I d H  W d    d S 1 s-w   Y  d S r   r   )r   r   r   rq   r   rA   rB   r     s   
"z3AsyncMultipartUpload.save_file.<locals>.upload_partc                   r   rA   r   r   r   rA   rB   r     r   z2AsyncMultipartUpload.save_file.<locals>.<listcomp>r1   c              	     r   r<   rA   r   r   rA   rB   r     r   z6AsyncMultipartUpload.save_file.<locals>.bounded_uploadc                   r   rA   rA   r   r   rA   rB   r     r  r  )r   r   r   r   r   r   r   r   r   rz   r  r   r  r   )r   ro   r   r   r   r   r   r   r   r   r  rA   )r   r   r   r   r   rB   r     s*   
zAsyncMultipartUpload.save_file)r   r5   ro   r   r   ry   r   r   r   r   r   r   r:   rK   r   r   r   )ro   r   r   ry   r   r5   rq   r   r   r   r   r   r   r   r:   r5   )ro   r   r   ry   r   r   r   r   r   r   r   r   r:   r5   r   rA   rA   rA   rB   r   `  s0    

*r   c                   @     e Zd ZdS )FalClientErrorNrD   rE   rF   rA   rA   rA   rB   r        r  c                   @  sD   e Zd ZU ded< ded< ded< ded< d	Zd
ed< dddZd	S )FalClientHTTPErrorr5   messager   status_coder   response_headershttpx.Responserp   Nr   
error_typer:   c                 C  s   | j  S r<   )r  r?   rA   rA   rB   __str__'  s   zFalClientHTTPError.__str__r   )rD   rE   rF   rG   r  r  rA   rA   rA   rB   r
    s   
 r
  c                   @  s,   e Zd ZU ded< dZded< d
dd	ZdS )FalClientTimeoutErrorfloatr   NOptional[str]
request_idr:   r5   c                 C  s.   | j d u rd| j dS d| j  d| j dS )NzRequest timed out after z secondszRequest z timed out after )r  r   r?   rA   rA   rB   r  0  s   
zFalClientTimeoutError.__str__r   )rD   rE   rF   rG   r  r  rA   rA   rA   rB   r  +  s   
 r  rp   r  r:   rK   c                 C  s   z|    W d S  tjyT } z@d }| j}z|  }W n ty&   d }Y nw t|tr8|d| j}|d}|d u rB| j	d}t
|| jt| j	| |d|d }~ww )Ndetailr  zx-fal-error-type)rp   r  )rl   ri   HTTPStatusErrortextrg   r   
isinstancedictgetrf   r
  r  )rp   excr  msgbodyrA   rA   rB   _raise_for_status7  s4   

r  c                   @  r  )StatusNr  rA   rA   rA   rB   r  U  r	  r  c                   @  s   e Zd ZU dZded< dS )QueuedzIndicates the request is enqueued and waiting to be processed. The position
    field indicates the relative position in the queue (0-indexed).r   positionN)rD   rE   rF   __doc__rG   rA   rA   rA   rB   r   Y  s   
 r   c                   @  s    e Zd ZU dZe Zded< dS )
InProgresszIndicates the request is currently being processed. If the status operation called
    with the `with_logs` parameter set to True, the logs field will be a list of
    log objects.list[dict[str, Any]] | NonelogsN)rD   rE   rF   r"  r	   r%  rG   rA   rA   rA   rB   r#  a  s   
 r#  c                   @  sR   e Zd ZU dZe Zded< e Zded< eddZded	< eddZ	ded
< dS )	Completeda2  Indicates the request has been completed and the result can be gathered. The logs field will
    contain the logs if the status operation was called with the `with_logs` parameter set to True. Metrics
    might contain the inference time, and other internal metadata (number of tokens
    processed, etc.).r$  r%  dict[str, Any]metricsN)defaultr   errorr  )
rD   rE   rF   r"  r	   r%  rG   r(  r*  r  rA   rA   rA   rB   r&  k  s   
 r&  T)frozenc                   @  sV   e Zd ZU ded< eddZded< eddZded< eddZded< dddZdS )_BaseRequestHandler5   r  Freprresponse_url
status_url
cancel_urlrq   AnyJSONr:   r  c                 C  s~   |d dkrt |d dS |d dkrt|d dS |d dkr6|d	i }t|d ||d
|ddS td|d  )NstatusIN_QUEUEqueue_position)r!  IN_PROGRESSr%  )r%  	COMPLETEDr(  r*  r  )r%  r(  r*  r  zUnknown status: )r   r#  r  r&  r   )r@   rq   r(  rA   rA   rB   _parse_status  s   z _BaseRequestHandle._parse_statusN)rq   r2  r:   r  )	rD   rE   rF   rG   r	   r/  r0  r1  r8  rA   rA   rA   rB   r,  x  s   
 r,  	workflowscomfyidr5   c                 C  s\   dd l }| d}t|dkr| S |d| }|r&| \}}| d| S td|  d)Nr   r+   r1   z^([0-9]+)-([a-zA-Z0-9-]+)$zInvalid app id: z*. Must be in the format <appOwner>/<appId>)resplitr   matchgroupsr   )r;  r<  r   r>  	app_ownerapp_idrA   rA   rB   _ensure_app_id_format  s   
rB  c                   @  s<   e Zd ZU ded< ded< ded< ded< edd	d
ZdS )AppIdr5   owneraliasr  r   	namespaceendpoint_idr:   c                 C  sv   t |}|d}|d tv r&| |d |d d|dd  p d |d dS | |d |d d|dd  p7d d dS )Nr+   r   r1         )rD  rE  r   rF  )rB  r=  APP_NAMESPACESjoin)r   rG  normalized_idr   rA   rA   rB   from_endpoint_id  s   
zAppId.from_endpoint_idN)rG  r5   r:   rC  )rD   rE   rF   rG   r   rM  rA   rA   rA   rB   rC    s   
 rC  x   g     V@)r1   <   rA  c                 C  sF   | j r	| j  dnd}| jrd| j nd}| | j d| j | S )Nr+   rN   )rF  r   rD  rE  )rA  prefixsuffixrA   rA   rB   _format_app_path  s   rR  valuer   r   c                 C  sH   | d u rd S t \}}||   kr|ks n td| d| dt| S )Nzmax_buffering must be between z and z (inclusive))REALTIME_MAX_BUFFERINGr   r5   )rS  	min_value	max_valuerA   rA   rB   _serialize_max_buffering  s   rW  rN   r   max_bufferingapplicationr6   r   rY  c          	      C  sv   t | }t|}t | }|r|d|d 7 }i }|r"||d< t|}|d ur.||d< |r9| dt| S |S )Nr+   fal_jwt_tokenrY  ?)rC  rM  rR  REALTIME_URL_FORMATlstriprW  r   )	rZ  r6   r   rY  rA  app_pathr   queryserialized_bufferingrA   rA   rB   _build_runner_ws_url  s   
rb  realtimer   c                C  s   t | |||dS )NrX  )rb  )rZ  r6   rY  r   rA   rA   rB   _build_realtime_url  s   re  rq   r   c                 C  sP   t | tr| S t | tr$t | dtr| d S t | dtr$| d S td)Nr6   r  z)Unexpected realtime token response format)r  r5   r  r  RuntimeError)rq   rA   rA   rB   _parse_token_response  s   

rg  c                      s(   e Zd ZdZ		dd fd	d
Z  ZS )RealtimeErrorz9Raised when the realtime endpoint sends an error payload.Nr*  r5   reasonr   payloadOptional[dict[str, Any]]c                   sD   || _ |pd| _|pi | _| js|n| d| j }t | d S )NrN   z: )r*  ri  rj  superrb   )r@   r*  ri  rj  r  	__class__rA   rB   rb   
  s
   

zRealtimeError.__init__)NN)r*  r5   ri  r   rj  rk  )rD   rE   rF   r"  rb   __classcell__rA   rA   rm  rB   rh    s
    rh  r  r   c                 C     dd l }|j| ddS )Nr   F)raw)msgpackunpackbr  rr  rA   rA   rB   msgpack_decode_message     ru  c                 C  rp  )Nr   T)use_bin_type)rr  packbrt  rA   rA   rB   msgpack_encode_message  rv  ry  decode_messageCallable[[bytes], Any] | Nonedict[str, Any] | Nonec                 C  s   t | tr	|  } t | ttfr|pt}|| S t | trRzt| }W n tj	y3   d| d Y S w |
d}|dkrJt|
dd|
d||dkrPd S |S d	| iS )
Nr  )typerj  r}  zx-fal-errorr*  UNKNOWN_ERRORri  zx-fal-messagerj  )r  
memoryviewtobytesr   	bytearrayru  r5   rg   loadsJSONDecodeErrorr  rh  )r  rz  decoderj  msg_typerA   rA   rB   _decode_realtime_message#  s,   



r  r'  encode_messageCallable[[Any], bytes] | Nonec                 C  s   |pt }|| S r<   )ry  )r  r  encoderA   rA   rB   _encode_realtime_messageB  s   r  c                   @  d   e Zd ZU dZded< dZded< dZded< dddZdddZdddZ	dddZ
dddZdS )RealtimeConnectionz(Synchronous realtime connection wrapper.z'Connection'_wsNr  _encode_messager{  _decode_message	argumentsr'  r:   rK   c                 C  s   t || j}| j| d S r<   r  r  r  sendr@   r  rj  rA   rA   rB   r  R  s   zRealtimeConnection.sendr|  c              
   C  s   	 z| j  }W n. ty6 } z"ddlm}m} t||r$W Y d }~d S t||r1tdt|| d }~ww t	|| j
}|d u rBq |S NTr   )ConnectionClosedConnectionClosedOKCONNECTION_CLOSEDr  recv	Exceptionwebsockets.exceptionsr  r  r  rh  r5   r  r  r@   rp   r  r  r  decodedrA   rA   rB   r  V  s    

zRealtimeConnection.recvc                 C  s$   t | jdd }t|r|  d S d S Nclosegetattrr  callabler@   r  rA   rA   rB   r  j  s   
zRealtimeConnection.closec                 C  s   | S r<   rA   r?   rA   rA   rB   	__enter__o  s   zRealtimeConnection.__enter__c                 C  s   |    d S r<   r  r@   exc_typer  tbrA   rA   rB   __exit__r  s   zRealtimeConnection.__exit__r  r'  r:   rK   r:   r|  r:   rK   )r:   r  )rD   rE   rF   r"  rG   r  r  r  r  r  r  r  rA   rA   rA   rB   r  J     
 



r  c                   @  r  )AsyncRealtimeConnectionz)Asynchronous realtime connection wrapper.z'WebSocketClientProtocol'r  Nr  r  r{  r  r  r'  r:   rK   c                   s$   t || j}| j|I d H  d S r<   r  r  rA   rA   rB   r  ~  s   zAsyncRealtimeConnection.sendr|  c              
     s   	 z
| j  I d H }W n. ty: } z"ddlm}m} t||r(W Y d }~d S t||r5tdt|| d }~ww t	|| j
}|d u rFq|S r  r  r  rA   rA   rB   r    s"   

zAsyncRealtimeConnection.recvc                   s,   t | jdd }t|r| I d H  d S d S r  r  r  rA   rA   rB   r    s
   zAsyncRealtimeConnection.closec                   s   | S r<   rA   r?   rA   rA   rB   
__aenter__  s   z"AsyncRealtimeConnection.__aenter__c                   s   |   I d H  d S r<   r  r  rA   rA   rB   	__aexit__  s   z!AsyncRealtimeConnection.__aexit__r  r  r  )r:   r  )rD   rE   rF   r"  rG   r  r  r  r  r  r  r  rA   rA   rA   rB   r  v  r  r  r   rf   dict[str, str] | NoneIterator['Connection']c                 c  sL    ddl m} |j| |td d}|V  W d    d S 1 sw   Y  d S )Nr   )ro   additional_headersopen_timeoutmax_size)websockets.syncro   connectREALTIME_OPEN_TIMEOUT)r   rf   ro   wsrA   rA   rB   _connect_sync_ws  s   "r  (AsyncIterator['WebSocketClientProtocol']c              	   C s\   dd l }|j| |td d4 I d H }|V  W d   I d H  d S 1 I d H s'w   Y  d S )Nr   r  )
websocketsr  r  )r   rf   r  r  rA   rA   rB   _connect_async_ws  s   .r  ro   r   methodkwargsc                 K  s    | j ||fi |}t| |S r<   requestr  ro   r  r   r  rp   rA   rA   rB   r     s   r   r   c                   s(   | j ||fi |I d H }t| |S r<   r  r  rA   rA   rB   r     s   r   皙?   )i  i  i  )i  i          ^@g      >@)r  r;   c                 C  s.   | j tvrdS d| jv rdS d| jv rdS dS )z-Tell apart ingress errors from client errors.Fzx-fal-request-idnginxT)r  INGRESS_ERROR_CODESrf   r  )rp   rA   rA   rB   _is_ingress_error  s   


r  extra_retry_codes	list[int]c                 C  sB   | j dkr| jtrdS t| rdS | j tv s| j |v rdS dS )Nr  FT)r  rf   r  r#   r  RETRY_CODES)rp   r  rA   rA   rB   _should_retry_response  s   r  r  r  c                 C  s   t | tjr(z| j}t |tjrt|jv rW dS W dS W dS  ty'   Y dS w t | tjr0dS t | tj	t
fr>t| j|S dS )NFT)r  ri   TimeoutExceptionr  Requestr$   rf   rf  TransportErrorr  r
  r  rp   )r  r  r  rA   rA   rB   _should_retry  s&   
r  exponentialF	num_retryr   
base_delayr  	max_delaybackoff_typeLiteral['exponential', 'fixed']jitterc                 C  sH   |dkrt |d| d   |}nt ||}|r|tdd9 }t ||S )Nr  rH  r1   g      ?g      ?)rW   randomuniform)r  r  r  r  r  delayrA   rA   rB   _get_retry_delay  s   

r  )r  c                K  s   t dtd D ]L}zt| ||fi |W   S  tjtfyS } z.t||rN|tk rNt|tt	dd}t
d| d| dt|  d t| W Y d }~q d }~ww td)	Nr1   r  TRetrying request to  due to  ( attempts left)Failed to perform request)r   MAX_ATTEMPTSr   ri   	HTTPErrorr
  r  r  
BASE_DELAY	MAX_DELAYloggerdebugtimesleeprf  ro   r  r   r  r  attemptr  r  rA   rA   rB   r   )  s"   

r   c                  s   t dtd D ]R}zt| ||fi |I d H W   S  tjtfyZ } z1t||rU|tk rUt|dddd}t	d| d| dt|  d	 t
|I d H  W Y d }~q d }~ww td
)Nr1   r  r|   r  Tr  r  r  r  r  )r   r  r   ri   r  r
  r  r  r  r  rz   r  rf  r  rA   rA   rB   r   C  s     
r   rJ   r   c                 C  s    | j  dkrd| j S | jS )NkeyzBearer )schemelowerr6   r_   rJ   rA   rA   rB   _cdn_auth_header[  s   r  r   r   r   c                 C  s"   |t | d}|d ur||d< |S )N)rU   rS   r   )r  )rJ   r   r   rf   rA   rA   rB   _cdn_upload_headersa  s   r  c                 C  s   | j dddS )NrQ   rR   )r_   r  rA   rA   rB   _storage_upload_headersj  s   r  
repositoryUploadRepositoryId | Nonefallback_repository4UploadRepositoryId | list[UploadRepositoryId] | Nonec                 C  sx   h d}| d u r
t } |d u rt}nt|ts|g}| g|}g }|D ]}||vr0td| d||vr9|| q"|S )N>   r)   r*   r(   zUnsupported upload repository '')r.   r0   r  listr   r   )r  r  allowedordereddedupedentryrA   rA   rB   _normalize_upload_repositoriesr  s    


r  c                 C  s   | pd|dS )N
upload.binr   r   rA   r   rA   rA   rB   _storage_upload_payload  s   r  c          	      C  sV   t | dt dt||t|d}| }|d }|d }t | d||d|id d |S 	Nr   z)/storage/upload/initiate?storage_type=gcs)rg   rf   
upload_urlfile_urlr   rU   )r   rf   r   )r   r]   r  r  rg   	ro   rJ   rq   r   r   init_responseinit_resultr  r  rA   rA   rB   _upload_via_storage  s&   r  c          	        sd   t | dt dt||t|dI d H }| }|d }|d }t | d||d|id dI d H  |S r  )r   r]   r  r  rg   r  rA   rA   rB   _async_upload_via_storage  s(   r	  c                C  s"   t | dtd ||d}| d S Nr   z/files/upload)r   rf   r   )r   CDN_URLrg   ro   rq   rf   rp   rA   rA   rB   
_upload_v3  s   r  c             	   C  s*   t | dtd |t|||d}| d S r
  )r   FAL_CDN_FALLBACK_URLr  rg   ro   rJ   rq   r   r   rp   rA   rA   rB   _upload_cdn  s   
r  c                  s*   t | dtd ||dI d H }| d S r
  )r   r  rg   r  rA   rA   rB   _async_upload_v3  s   r  c             	     s2   t | dtd |t|||dI d H }| d S r
  )r   r  r  rg   r  rA   rA   rB   _async_upload_cdn  s   
r  attempts#list[tuple[str, Callable[[], str]]]c                 C  s|   t | D ]5\}\}}z| W   S  ty9 } z|t| d kr! td|| |d  d | W Y d }~qd }~ww tdNr1   z+Upload failed to %s, falling back to %s: %sr   zUpload attempts were exhausted)	enumerater  r   r  warningrf  )r  idxlabelr  r  rA   rA   rB   _try_upload_with_fallback  s   	r  #list[tuple[str, Callable[[], Any]]]c                   s   t | D ]D\}\}}z| }t|r|I d H W   S |W   S  tyI } z|t| d kr1 td|| |d  d | W Y d }~qd }~ww tdr  )r  rz   iscoroutiner  r   r  r  rf  )r  r  r  r  r   r  rA   rA   rB   _async_try_upload_with_fallback   s&   

	r  handleSyncRequestHandlec                 C  s$   z|    W d S  ty   Y d S w r<   cancelr  r  rA   rA   rB   _maybe_cancel_request5  s
   r#  AsyncRequestHandlec                   s,   z
|   I d H  W d S  ty   Y d S w r<   r   r"  rA   rA   rB   _async_maybe_cancel_request<  s   r%  c                   @  d   e Zd ZU eddZded< edd	d
Zddd ddZdddd!ddZ	d"ddZ
d#ddZdS )$r  Fr-  r   ro   rZ  r5   r  r:   c                 C  Z   t |}|jr|j dnd}t | |j d|j d| }| |||d |d |dS Nr+   rN   z
/requests/z/statusz/cancelr  r/  r0  r1  ro   rC  rM  rF  QUEUE_URL_FORMATrD  rE  r   ro   rZ  r  rA  rP  rh   rA   rA   rB   from_request_idG     
 z!SyncRequestHandle.from_request_id	with_logsr0  r;   r  c                C  s0   t | jd| jd|itd}t| | | S )Returns the status of the request (which can be one of the following:
        Queued, InProgress, Completed). If `with_logs` is True, logs will be included
        for InProgress and Completed statuses.GETr%  paramsr   )r   ro   r0  QUEUE_POLL_TIMEOUTr  r8  rg   r@   r0  rp   rA   rA   rB   r3  Y  s   	zSyncRequestHandle.statusr  r0  intervalr8  r  Iterator[Status]c                c  s0    	 | j |d}|V  t|trdS t| qzContinuously poll for the status of the request and yield it at each interval till
        the request is completed. If `with_logs` is True, logs will be included in the response.
        Tr/  N)r3  r  r&  r  r  r@   r0  r8  r3  rA   rA   rB   iter_eventsk  s   

zSyncRequestHandle.iter_eventsr2  c                 C  s6   | j ddD ]}qt| jd| jtd}t| | S )zOWait till the request is completed and return the result of the inference call.Fr/  r2  r   )r<  r   ro   r/  r5  r  rg   r@   _rp   rA   rA   rB   r  z  s   zSyncRequestHandle.getrK   c                 C  s    t | jd| jtd}t| dS zCancel the request.r   r=  N)r   ro   r1  r5  r  r@   rp   rA   rA   rB   r!    s   zSyncRequestHandle.cancelN)ro   r   rZ  r5   r  r5   r:   r  r0  r;   r:   r  )r0  r;   r8  r  r:   r9  r:   r2  r  rD   rE   rF   r	   ro   rG   r   r-  r3  r<  r  r!  rA   rA   rA   rB   r  C  s   
 
c                   @  r&  )$r$  Fr-  r   ro   rZ  r5   r  r:   c                 C  r'  r(  r*  r,  rA   rA   rB   r-    r.  z"AsyncRequestHandle.from_request_idr/  r0  r;   r  c                  s8   t | jd| jd|itdI dH }t| | | S )r1  r2  r%  r3  N)r   ro   r0  r5  r  r8  rg   r6  rA   rA   rB   r3    s   	zAsyncRequestHandle.statusr  r7  r8  r  AsyncIterator[Status]c                C s<   	 | j |dI dH }|V  t|trdS t|I dH  qr:  )r3  r  r&  rz   r  r;  rA   rA   rB   r<    s   
zAsyncRequestHandle.iter_eventsr2  c                   sH   | j dd2 z3 dH W }q6 t| jd| jtdI dH }t| | S )z9Wait till the request is completed and return the result.Fr/  Nr2  r=  )r<  r   ro   r/  r5  r  rg   r>  rA   rA   rB   r    s   zAsyncRequestHandle.getrK   c                   s(   t | jd| jtdI dH }t| dS r@  )r   ro   r1  r5  r  rA  rA   rA   rB   r!    s   zAsyncRequestHandle.cancelN)ro   r   rZ  r5   r  r5   r:   r$  rB  )r0  r;   r8  r  r:   rE  rC  r  rD  rA   rA   rA   rB   r$    s   
 
c                
   @  s  e Zd ZU edddZded< dZded< eduddZduddZ	dvddZ
edwddZedxddZdxddZeddyddZd dddi d!dzd+d,Zd dddi dd-d{d2d3Zd dddddi ddd4	d|d<d=Zd}d?d@ZddAd~dCdDZddEdFZddHdIZdJddKddNdOZ	ddddPddYdZZdddPdd\d]Z	^ddddPddbdcZedddededddfddodpZeddd dedqddsdtZdS )r{   NFr)  r.  r   r  r  r  default_timeoutr:   r   c                 C     | j d u rt S td| j S NKeyr  r   r   r?   rA   rA   rB   rV        
zAsyncClient._authc                 C     | j S r<   rV   r?   rA   rA   rB   	_get_auth     zAsyncClient._get_authr5   c                 C  $   |   }|j dkrtd|jS Nr  zZKey credentials are required for this operation. Set FAL_KEY or FAL_KEY_ID/FAL_KEY_SECRET.rO  r  r  r   r6   ra   rA   rA   rB   _get_key     zAsyncClient._get_keyry   c                 C     t |  S r<   )ry   rO  r?   rA   rA   rB   r        zAsyncClient._token_managerr   c                 C  s    |   }tj|jtd| jdS )Nr   rf   r   )rO  ri   r{   r_   
USER_AGENTrG  ra   rA   rA   rB   r     s   zAsyncClient._clientc                   s6   | j  I d H }tj|j d|j td| jdS Nr   r   rX  )r   rt   ri   r{   r7   r6   rY  rG  r   rA   rA   rB   _get_cdn_client  s   zAsyncClient._get_cdn_clienttoken_expirationrZ  r]  r   c                  s@   t |jg|d}t| jdt d|dI d H }t| S N)allowed_appsr]  r   z/tokens/)rg   )rC  rM  rE  r   r   r]   rg  rg   r@   rZ  r]  rj  rp   rA   rA   rB   _get_realtime_token  s   zAsyncClient._get_realtime_tokenrN   r   r   start_timeouthintrf   r  r2  r   r   Optional[Union[int, float]]rc  rd  rf   r   c                  sx   t | }|r|d|d 7 }i |}	|durt||	 |dur&t||	 t| jd||||	dI dH }
t|
 |
 S )ad  Run an application with the given arguments (which will be JSON serialized). The path parameter can be used to
        specify a subpath when applicable. This method will return the result of the inference call directly.

        Args:
            timeout: Client-side HTTP timeout in seconds. Controls how long the HTTP
                client waits for a response. Defaults to the client's default_timeout.
            start_timeout: Server-side request timeout in seconds. Limits total time spent
                waiting before processing starts. Does not apply once the application begins processing.
        r+   Nr   rg   r   rf   )RUN_URL_FORMATr^  r"   r!   r   r   r  rg   r@   rZ  r  r   r   rc  rd  rf   r   r`   rp   rA   rA   rB   run!  s&   

	zAsyncClient.runr   rd  webhook_urlpriorityrf   rc  rk  rl  Optional[Priority]r$  c                  s   t | }	|r|	d|d 7 }	|dur|	dtd|i 7 }	i |}
|dur+t||
 |dur4t||
 |dur=t||
 t| jd|	|| j|
dI dH }t	| |
 }t|d |d |d	 |d
 | jdS )aP  Submit an application with the given arguments (which will be JSON serialized). The path parameter can be used to
        specify a subpath when applicable. This method will return a handle to the request that can be used to check the status
        and retrieve the result of the inference call when it is done.

        Args:
            start_timeout: Server-side request timeout in seconds. Limits total time spent
                waiting before processing starts (includes queue wait, retries, and
                routing). Does not apply once the application begins processing.
        r+   Nr\  fal_webhookr   rf  r  r/  r0  r1  r)  )r+  r^  r   r"   r    r!   r   r   rG  r  rg   r$  r@   rZ  r  r   rd  rk  rl  rf   rc  r   r`   rp   rq   rA   rA   rB   r   O  s<   


zAsyncClient.submit	r   rd  r0  
on_enqueueon_queue_updaterl  rf   rc  client_timeoutr0  r;   rq  1Optional[Callable[[str], None | Awaitable[None]]]rr  4Optional[Callable[[Status], None | Awaitable[None]]]rs  c       	           s   |dur
du r|
n
|krt jd
 d| dtdd dgd 	
fd	d
}|du r>| I dH S ztj| |dI dH W S  tjyr } zd}d }|durg|j}t|I dH  t||d|d}~ww )<  Subscribe to an application and wait for the result.

        Args:
            start_timeout: Server-side request timeout in seconds. Limits total time spent
                waiting before processing starts (includes queue wait, retries, and
                routing). Does not apply once the application begins processing.
            client_timeout: Client-side total timeout in seconds. Limits the total time
                spent waiting for the entire request to complete (including queue wait
                and processing). If not set, waits indefinitely.
        Nstart_timeout ("s) is larger than client_timeout (Ts). The request may timeout on the client before the server-side timeout is reached.rH  
stacklevelr:   r2  c               	     s   	j  
dI d H } | d< d ur'| j}t|r'|I d H  d urG| jd2 z3 d H W }|}t|rE|I d H  q16 |  I d H S N)r   rd  rl  rf   rc  r   r/  )r   r  inspectisawaitabler<  r  )r  r   eventrZ  r  
handle_refrf   rd  rq  rr  r   rl  r@   rc  r0  rA   rB   _do_subscribe  s.   	




z,AsyncClient.subscribe.<locals>._do_subscriber=  r   r   r  rC  )	warningswarnUserWarningrz   wait_forTimeoutErrorr  r%  r  )r@   rZ  r  r   rd  r0  rq  rr  rl  rf   rc  rs  r  er  r  rA   r  rB   	subscribe  s<   $zAsyncClient.subscriber  c                 C     t | j||S r<   )r$  r-  r   r@   rZ  r  rA   rA   rB   
get_handle     zAsyncClient.get_handler/  r  c                  s    |  ||}|j|dI d H S Nr/  r  r3  r@   rZ  r  r0  r  rA   rA   rB   r3    s   zAsyncClient.statusc                   s   |  ||}| I d H S r<   r  r  r@   rZ  r  r  rA   rA   rB   r     s   zAsyncClient.resultrK   c                   s    |  ||}| I d H  d S r<   r  r!  r  rA   rA   rB   r!    s   zAsyncClient.cancel/streamr   r   float | NoneAsyncIterator[dict[str, Any]]c             	   C s   t | }|r|d|d 7 }t| jd|||d4 I dH }| 2 z3 dH W }| V  q#6 W d  I dH  dS 1 I dH sAw   Y  dS ay  Stream the output of an application with the given arguments (which will be JSON serialized). This is only supported
        at a few select applications at the moment, so be sure to first consult with the documentation of individual applications
        to see if this is supported.

        The function will iterate over each event that is streamed from the server.
        r+   r   )rg   r   N)rg  r^  r   r   	aiter_sserg   r@   rZ  r  r   r   r   eventsr  rA   rA   rB   stream  s    .zAsyncClient.streamr  r  rq   str | bytesr   r   r  r  r  r  c                  s.  |   }t|tr|d}t||}t|tkr;|d dkr;|du r&d}|  I dH }tj	|| j
|||dI dH S d|i}	|durG||	d< g }
|D ]D}|dkrf|  I dH }|
dtt|||	d	f qK|d
kr{|
d
tt| j||||df qK|dkr|
dtt| j||||df qKt|
I dH S zUpload the given data blob to the CDN and return the access URL. The content type should be specified
        as the second argument. Use upload_file or upload_image for convenience.utf-8r   r(   Nr  )ro   r   r   rq   r   rU   r   )rq   rf   r)   )rq   r   r   r*   )rO  r  r5   r  r  r   MULTIPART_THRESHOLDr[  r   r   r   r   r   r  r  r   r	  r  r@   rq   r   r   r  r  rJ   repository_chainro   rf   r  reporA   rA   rB   upload	  st   

zAsyncClient.uploados.PathLikec          	        s   t |\}}|du rd}t||}tj|tkr7|d dkr7|  I dH }tj	t
||| j|dI dH S t|d}| j| |tj|||dI dH W  d   S 1 sZw   Y  dS zMUpload a file from the local filesystem to the CDN and return the access URL.Nr   r   r(   )r   ro   r   r   r   )r   r  r  )	mimetypes
guess_typer  r   r   r   r  r[  r   r   r5   r   r   r  r   r   	r@   r   r  r  	mime_typer?  r  ro   filerA   rA   rB   upload_fileX  s2   

$zAsyncClient.upload_filejpegimageImage.Imageformatc                  s^   t   }|j||d | j| d| ||dI dH W  d   S 1 s(w   Y  dS zBUpload a pillow image object to the CDN and return the access URL.r  image/r  NioBytesIOr   r  getvaluer@   r  r  r  r  bufferrA   rA   rB   upload_image  s   

$zAsyncClient.upload_imageT	/realtimeuse_jwtr   rY  r]  r  rz  r  rY  r   r  r  rz  r{  &AsyncIterator[AsyncRealtimeConnection]c             	   C s   d }d }	|r| j ||dI d H }	n
|  }
|
jtd}t||	||d}t||d4 I d H }t|||dV  W d   I d H  d S 1 I d H sHw   Y  d S Nr\  r   rd  r   )r  r  )ra  rO  r_   rY  re  r  r  r@   rZ  r  r   rY  r]  r  rz  rf   r6   rJ   r   r  rA   rA   rB   rc    s   
.zAsyncClient.realtimer  r   rY  r]  r  c             	   C s   d }d }|r| j ||dI d H }n
|  }|jtd}t||||d}	t|	|d4 I d H }
|
V  W d   I d H  d S 1 I d H sCw   Y  d S Nr\  r   rX  r   )ra  rO  r_   rY  rb  r  r@   rZ  r  r   rY  r]  rf   r6   rJ   r   r  rA   rA   rB   
ws_connect  s$   
.zAsyncClient.ws_connectr:   r   r   )r:   ry   )r:   r   rZ  r5   r]  r   r:   r5   rZ  r5   r  r2  r   r5   r   re  rc  re  rd  r   rf   r   r:   r2  )rZ  r5   r  r2  r   r5   rd  r   rk  r   rl  rm  rf   r   rc  re  r:   r$  )rZ  r5   r  r2  r   r5   rd  r   r0  r;   rq  rt  rr  ru  rl  rm  rf   r   rc  re  rs  re  r:   r2  )rZ  r5   r  r5   r:   r$  rZ  r5   r  r5   r0  r;   r:   r  rZ  r5   r  r5   r:   r2  rZ  r5   r  r5   r:   rK   )
rZ  r5   r  r2  r   r5   r   r  r:   r  r<   rq   r  r   r5   r   r   r  r  r  r  r:   r5   r   r  r  r  r  r  r:   r5   r  
r  r  r  r5   r  r  r  r  r:   r5   )rZ  r5   r  r;   r   r5   rY  r   r]  r   r  r  rz  r{  r:   r  )rZ  r5   r  r;   r   r5   rY  r   r]  r   r:   r  )rD   rE   rF   r	   r  rG   rG  r
   rV   rO  rT  r   r   r[  !REALTIME_TOKEN_EXPIRATION_SECONDSra  ri  r   r  r  r3  r   r!  r  r  r  r  r   rc  r  rA   rA   rA   rB   r{     s   
 



3A
P

	!S*r{   c                
   @  s  e Zd ZU edddZded< dZded< edxddZdxddZ	dyddZ
edzddZed{ddZed|ddZdzddZedd}d!d"Zd#dddi d$d~d.d/Zd#dddi dd0dd5d6Zd#dddddi ddd7	dd?d@ZddBdCZddDddFdGZddHdIZddKdLZdMddNddQdRZ	ddddSdd\d]ZdddSdd_d`Z	addddSddedfZedgdhdedddiddrdsZedgd#dedtddvdwZdS )
SyncClientNFrF  r   r  r  r  rG  r:   r   c                 C  rH  rI  rK  r?   rA   rA   rB   rV     rL  zSyncClient._authc                 C  rM  r<   rN  r?   rA   rA   rB   rO    rP  zSyncClient._get_authr5   c                 C  rQ  rR  rS  ra   rA   rA   rB   rT    rU  zSyncClient._get_keyr   c                 C  s"   |   }tj|jtd| jddS )Nr   T)rf   r   follow_redirects)rO  ri   rj   r_   rY  rG  ra   rA   rA   rB   r     s   zSyncClient._clientrI   c                 C  rV  r<   )rI   rO  r?   rA   rA   rB   r     rW  zSyncClient._token_manager%concurrent.futures.ThreadPoolExecutorc                 C  s   t S r<   )EXECUTORr?   rA   rA   rB   	_executor  s   zSyncClient._executorc                 C  s.   | j  }tj|j d|j td| jdS rZ  )r   rt   ri   rj   r7   r6   rY  rG  r   rA   rA   rB   r[    s   
zSyncClient._get_cdn_clientr\  rZ  r]  r   c                C  s8   t |jg|d}t| jdt d|d}t| S r^  )rC  rM  rE  r   r   r]   rg  rg   r`  rA   rA   rB   ra    s   zSyncClient._get_realtime_tokenrN   rb  r  r2  r   r   re  rc  rd  rf   r   c                C  sp   t | }|r|d|d 7 }i |}	|durt||	 |dur%t||	 t| jd||||	d}
t|
 |
 S )a  Run an application with the given arguments (which will be JSON serialized).

        Args:
            timeout: Client-side HTTP timeout in seconds. Controls how long the HTTP
                client waits for a response. Defaults to the client's default_timeout.
            start_timeout: Server-side request timeout in seconds. Limits total time spent
                waiting before processing starts. Does not apply once the application begins processing.
        r+   Nr   rf  )rg  r^  r"   r!   r   r   r  rg   rh  rA   rA   rB   ri    s$   

zSyncClient.runrj  rk  rl  rm  r  c                C  s   t | }	|r|	d|d 7 }	|dur|	dtd|i 7 }	i |}
|dur*t||
 |dur3t||
 |dur<t||
 t| jd|	|| j|
d}t	| |
 }t|d |d |d	 |d
 | jdS )ag  Submit an application with the given arguments (which will be JSON serialized).

        Args:
            start_timeout: Server-side request timeout in seconds. Limits total time spent
                waiting before processing starts (includes queue wait, retries, and
                routing). Does not apply once the application begins processing.
        r+   Nr\  rn  r   rf  r  r/  r0  r1  r)  )r+  r^  r   r"   r    r!   r   r   rG  r  rg   r  ro  rA   rA   rB   r   >  s:   


zSyncClient.submitrp  r0  r;   rq  Optional[Callable[[str], None]]rr  "Optional[Callable[[Status], None]]rs  c       	           s   |dur
du r|
n
|krt jd
 d| dtdd dgd 	
fd	d
}|du r:| S 	j|}z|j|dW S  tjjym } zd}d }|durb|j	}t
| t||d|d}~ww )rv  Nrw  rx  ry  rH  rz  r:   r2  c               	     s\   	j  
d} | d< d ur| j d ur*| jdD ]}| q#|  S r|  )r   r  r<  r  )r  r  r  rA   rB   r    s    	

z+SyncClient.subscribe.<locals>._do_subscriber=  r   r  rC  )r  r  r  r  r   r   r   r   r  r  r#  r  )r@   rZ  r  r   rd  r0  rq  rr  rl  rf   rc  rs  r  r   r  r  r  rA   r  rB   r  w  s<   $zSyncClient.subscriber  c                 C  r  r<   )r  r-  r   r  rA   rA   rB   r    r  zSyncClient.get_handler/  r  c                C  s   |  ||}|j|dS r  r  r  rA   rA   rB   r3    s   zSyncClient.statusc                 C  s   |  ||}| S r<   r  r  rA   rA   rB   r     s   zSyncClient.resultrK   c                 C  s   |  ||}|  d S r<   r  r  rA   rA   rB   r!    s   zSyncClient.cancelr  r  r  Iterator[dict[str, Any]]c                c  sr    t | }|r|d|d 7 }t| jd|||d}| D ]}| V  qW d   dS 1 s2w   Y  dS r  )rg  r^  r   r   iter_sserg   r  rA   rA   rB   r    s   "zSyncClient.streamr  rq   r  r   r   r  r  r  r  c                C  s  |   }t|tr|d}t||}t|tkr4|d dkr4|du r%d}|  }tj	|| j
|||dS d|i}	|dur@||	d< g }
|D ]A}|dkr\|  }|
dtt|||	d	f qD|d
krq|
d
tt| j||||df qD|dkr|
dtt| j||||df qDt|
S r  )rO  r  r5   r  r  r   r  r[  r~   r   r   r   r   r  r  r   r  r  r  rA   rA   rB   r    sr   

zSyncClient.uploadr  c          	      C  s   t |\}}|du rd}t||}tj|tkr0|d dkr0|  }tj	t
||| j|dS t|d}| j| |tj|||dW  d   S 1 sPw   Y  dS r  )r  r  r  r   r   r   r  r[  r~   r   r5   r   r   r  r   r   r  rA   rA   rB   r  =	  s0   
$zSyncClient.upload_filer  r  r  r  c                C  sV   t  }|j||d | j| d| ||dW  d   S 1 s$w   Y  dS r  r  r  rA   rA   rB   r  d	  s   
$zSyncClient.upload_imageTr  r  r  rY  r   r  r  rz  r{  Iterator[RealtimeConnection]c                c  s    d }d }	|r| j ||d}	n
|  }
|
jtd}t||	||d}t||d}t|||dV  W d    d S 1 s;w   Y  d S r  )ra  rO  r_   rY  re  r  r  r  rA   rA   rB   rc  y	  s   
"zSyncClient.realtimer  r  c                c  sz    d }d }|r| j ||d}n
|  }|jtd}t||||d}	t|	|d}
|
V  W d    d S 1 s6w   Y  d S r  )ra  rO  r_   rY  rb  r  r  rA   rA   rB   r  	  s$   
"zSyncClient.ws_connectr  r   )r:   r   )r:   rI   )r:   r  r  r  )rZ  r5   r  r2  r   r5   rd  r   rk  r   rl  rm  rf   r   rc  re  r:   r  )rZ  r5   r  r2  r   r5   rd  r   r0  r;   rq  r  rr  r  rl  rm  rf   r   rc  re  rs  re  r:   r2  )rZ  r5   r  r5   r:   r  r  r  r  )
rZ  r5   r  r2  r   r5   r   r  r:   r  r<   r  r  r  r  )rZ  r5   r  r;   r   r5   rY  r   r]  r   r  r  rz  r{  r:   r  )rZ  r5   r  r;   r   r5   rY  r   r]  r   r:   r  ) rD   rE   rF   r	   r  rG   rG  r
   rV   rO  rT  r   r   r   r  r[  r  ra  ri  r   r  r  r3  r   r!  r  r  r  r  r   rc  r  rA   rA   rA   rB   r    s   
 


/>
M

	S*r  r  c                 C  s.   t | tr
| d} d| dt|   S )zIEncode the given data blob to a data URL with the specified content type.r  zdata:z;base64,)r  r5   r  base64	b64encoder  )rq   r   rA   rA   rB   r  	  s   

r  r  c                 C  sV   t | \}}|du rd}t| d}t| |W  d   S 1 s$w   Y  dS )zUEncode a file from the local filesystem to a data URL with the inferred content type.Nr   r   )r  r  r   r  r   )r   r  r?  r  rA   rA   rB   encode_file	  s   $r  r  r  r  r  c                 C  sN   t  }| j||d t| d| W  d   S 1 s w   Y  dS )zEEncode a pillow image object to a data URL with the specified format.r  r  N)r  r  r   r  r  )r  r  r  rA   rA   rB   encode_image	  s   
$r  )rp   r  r:   rK   )r;  r5   r:   r5   )rA  rC  r:   r5   )rS  r   r:   r   )
rZ  r5   r6   r   r   r5   rY  r   r:   r5   )
rZ  r5   r6   r   rY  r   r   r5   r:   r5   )rq   r   r:   r5   )r  r   r:   r   )r  r   r:   r   )r  r   rz  r{  r:   r|  )r  r'  r  r  r:   r   r<   )r   r5   rf   r  r:   r  )r   r5   rf   r  r:   r  )
ro   r   r  r5   r   r5   r  r   r:   r  )
ro   r   r  r5   r   r5   r  r   r:   r  )rp   r  r:   r;   )rp   r  r  r  r:   r;   )r  r  r  r  r:   r;   )r  F)r  r   r  r  r  r  r  r  r  r;   r:   r  )ro   r   r  r5   r   r5   r  r  r  r   r:   r  )ro   r   r  r5   r   r5   r  r  r  r   r:   r  )rJ   r   r:   r5   )rJ   r   r   r5   r   r   r:   r   )rJ   r   r:   r   )r  r  r  r  r:   r/   )r   r   r   r5   r:   r   )ro   r   rJ   r   rq   r   r   r5   r   r   r:   r5   )ro   r   rJ   r   rq   r   r   r5   r   r   r:   r5   )ro   r   rq   r   rf   r   r:   r5   )ro   r   rq   r   rf   r   r:   r5   )r  r  r:   r5   )r  r  r:   r5   )r  r  r:   rK   )r  r$  r:   rK   )rq   r  r   r5   r:   r5   )r   r  r:   r5   r  )r  r  r  r5   r:   r5   )
__future__r   r}  r  rg   r   r   r  rz   pathlibr   r  r  r  rZ   loggingr   r   
contextlibr   r   r   r   dataclassesr   r	   	functoolsr
   r   typingr   r   r   r   r   r   r   r   r   r   urllib.parser   r  ri   	httpx_sser   r   fal_client.authr   r   r   r   r   fal_client._versionr   fal_client._headersr   r    r!   r"   r#   r$   websockets.clientr%   websockets.sync.connectionr&   	getLoggerrD   r  PILr'   r5   r2  r-   rg  r+  r]  r]   r  environr  r  r.   rG   r0   rY  MIN_REQUEST_TIMEOUT_SECONDSr   r   r  r4   rI   ry   r  r   r   r~   r   r  r  r
  r  r  r  r  r   r#  r&  r,  rJ  rB  rC  r  r  rT  rR  rW  rb  re  rg  rf  rh  ru  ry  r  r  r  r  r  r  r   r   r  r  r  r  r  Timeoutr5  r  r  r  r  r   r   r  r  r  r  r  r  r	  r  r  r  r  r  r  r#  r%  r  r$  r{   r  r  r  r  rA   rA   rA   rB   <module>   s8   0 	

%% 1 <
	





++	LO   p   g
