
    l0j                    8   d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	Z	d dl
mZmZ d dlmZ d dlmZ d dlmZ d d	lmZ erd d
lmZ  ed            G d d          Z e             G d d                      Z G d de          Zd%dZd&d Zd'd!Zd(d$ZdS ))    )annotationsN)deepcopy)TYPE_CHECKINGOptionalUnion)documentset_documentation_group)utils)PredictBody)Error)	EventData)Approutesc                  T    e Zd ZdZd Zd Zd Zd ZddZd	 Z	d
 Z
d ZddZddZdS )Objz
    Using a class to convert dictionaries into objects. Used by the `Request` class.
    Credit: https://www.geeksforgeeks.org/convert-nested-python-dictionary-to-object/
    c                    | j                             |           |                                D ]A\  }}t          |t          t
          f          rt          |          }t          | ||           Bd S N)__dict__updateitems
isinstancedictlistr   setattr)selfdict_keyvalues       U/home/wildlama/miniconda3/envs/lam/lib/python3.11/site-packages/gradio/route_utils.py__init__zObj.__init__   ss    U###++-- 	& 	&JC%$.. #E

D#u%%%%	& 	&    c                    | j         |         S r   r   )r   items     r   __getitem__zObj.__getitem__"   s    }T""r!   c                    || j         |<   d S r   r#   r   r$   r   s      r   __setitem__zObj.__setitem__%   s    #dr!   c              #     K   | j                                         D ]4\  }}t          |t                    r|t	          |          fV  .||fV  5d S r   )r   r   r   r   r   )r   r   r   s      r   __iter__zObj.__iter__(   sp      ---// 	# 	#JC%%% #DKK(((((El""""		# 	#r!   returnboolc                    || j         v rdS | j                                         D ]}t          |t                    r||v r dS dS )NTF)r   valuesr   r   r'   s      r   __contains__zObj.__contains__/   sX    4=  4]))++ 	 	E%%% $%--ttur!   c                4    | j                                         S r   )r   keysr   s    r   r1   zObj.keys7   s    }!!###r!   c                4    | j                                         S r   )r   r.   r2   s    r   r.   z
Obj.values:   s    }##%%%r!   c                4    | j                                         S r   )r   r   r2   s    r   r   z	Obj.items=   s    }""$$$r!   strc                *    t          | j                  S r   r5   r   r2   s    r   __str__zObj.__str__@       4=!!!r!   c                *    t          | j                  S r   r7   r2   s    r   __repr__zObj.__repr__C   r9   r!   N)r+   r,   )r+   r5   )__name__
__module____qualname____doc__r    r%   r(   r*   r/   r1   r.   r   r8   r;    r!   r   r   r      s         
& & &# # #$ $ $# # #   $ $ $& & &% % %" " " "" " " " " "r!   r   c                  ,    e Zd ZdZ	 	 d
ddZd Zd	 ZdS )Requesta  
    A Gradio request object that can be used to access the request headers, cookies,
    query parameters and other information about the request from within the prediction
    function. The class is a thin wrapper around the fastapi.Request class. Attributes
    of this class include: `headers`, `client`, `query_params`, and `path_params`. If
    auth is enabled, the `username` attribute can be used to get the logged in user.
    Example:
        import gradio as gr
        def echo(name, request: gr.Request):
            print("Request headers dictionary:", request.headers)
            print("IP address:", request.client.host)
            return name
        io = gr.Interface(echo, "textbox", "textbox").launch()
    Nrequestfastapi.Request | Noneusername
str | Nonec                0    || _         || _        || _        dS )z
        Can be instantiated with either a fastapi.Request or by manually passing in
        attributes (needed for websocket-based queueing).
        Parameters:
            request: A fastapi.Request
        N)rC   rE   kwargs)r   rC   rE   rH   s       r   r    zRequest.__init__X   s      "r!   c                    t          |t                    r-t          j        t          j        |          t
                    S |S )N)object_hook)r   r   jsonloadsdumpsr   )r   ds     r   dict_to_objzRequest.dict_to_objh   s6    a 	:djmm====Hr!   c                    | j         r(|                     t          | j         |                    S 	 | j        |         }n&# t          $ r}t          d| d          |d }~ww xY w|                     |          S )Nz#'Request' object has no attribute '')rC   rO   getattrrH   KeyErrorAttributeError)r   nameobjkes       r   __getattr__zRequest.__getattr__n   s    < 		)##GDL$$?$?@@@k$'   $A$AAA  ##C(((s   ? 
A"	AA")NN)rC   rD   rE   rF   )r<   r=   r>   r?   r    rO   rX   r@   r!   r   rB   rB   G   s]         " +/## # # # #   
) 
) 
) 
) 
)r!   rB   c                      e Zd ZdS )FnIndexInferErrorN)r<   r=   r>   r@   r!   r   rZ   rZ   {   s        Dr!   rZ   appr   api_namer5   bodyr   r+   intc                    |j         Ot          |                                 j                  D ]\  }}|d         |k    r|c S t	          d| d          |j         S )Nr\   z&Could not infer fn_index for api_name .)fn_index	enumerate
get_blocksdependenciesrZ   )r[   r\   r]   ifns        r   infer_fn_indexrg      ss    }s~~//<== 	 	EAr*~)) *   T T T TUUU}r!   fn_index_inferredrE   Optional[str]rC   Optional[fastapi.Request]c                T   |                                  j        |         d         r|j        g|_        |j        rK|j        rfd|j        D             }nRt          |j        t                    sJ t          ddi|j        }n"|t          d          t          |          }|S )Ncancelsc                ,    g | ]}t          dd i|S )rE   r@   )rB   ).0reqrE   s     r   
<listcomp>z&compile_gr_request.<locals>.<listcomp>   s,    TTT';;8;s;;TTTr!   rE   z0request must be provided if body.request is None)rE   rC   r@   )
rc   rd   session_hashdatarC   batchedr   r   rB   
ValueError)r[   r]   rh   rE   rC   
gr_requests      `  r   compile_gr_requestrv      s     ~~$%67	B (&'	| 	A< 	DTTTTt|TTTJJdlD11111 CC(CdlCCJJ?OPPPh@@@
r!   c                l   |j         }t          |dd           }||| j        vr=d |                                 j                                        D             | j        |<   | j        |         }|| j        |         v r#i }| j        |                             |           n| j        |         }ni }i }||fS )Nrq   c           
     t    i | ]5\  }}t          |d d          |t          t          |dd                    6S )statefulFr   N)rR   r   )rn   _idblocks      r   
<dictcomp>z)restore_session_state.<locals>.<dictcomp>   sT     . . .C5*e44.XgeWd;;<<. . .r!   )	ra   rR   state_holderrc   blocksr   iterators_to_resetremove	iterators)r[   r]   ra   rq   session_stater   s         r   restore_session_stater      s    }H466Ls///. ."%.."2"2"9"?"?"A"A. . .C\*
 (6 s-l;;;I"<077AAAAl3II	)##r!   ru   Union[Request, list[Request]]c                  K   t          | |          \  }}|                                 j        |         }t          |d                   r|d         d         nd }t	          |r,|                                 j                            |          nd |j                  }t          |dd           }	|j	        }
t          |dd           }|j
        }|j         o|d         }|r|g}	 t          j                    5  |                                                     |||||||	|           d {V }d d d            n# 1 swxY w Y   |                    dd           }t!          |d          r|| j        |j                 |
<   t'          |t(                    r|n# t*          $ r |                    |
d           }|nt-          |          }|                                 j        |                             |i           }|                                D ]}|                    d             w xY w|r|d	         d         |d	<   |S )
N)r[   r]   targetsr   event_idrq   batch)ra   inputsrC   stater   rq   r   
event_dataiteratorrr   )r   rc   rd   lenr   r~   getr   rR   ra   rr   rs   r
   MatplotlibBackendManangerprocess_apipophasattrr   rq   r   r   BaseExceptionidpending_streamsr.   append)r[   r]   ru   rh   r   r   
dependencytargetr   r   ra   rq   r   batch_in_single_outoutputr   run_idr   streams                      r   call_process_apir      s       54HHHM9!!./@AJ),Z	-B)C)CMZ	"1%%F/5?##F+++4 J
 tZ..H}H466LYF"l*Bz'/B ,.. 
	 
	>>++77*"##)!% 8 	 	 	 	 	 	 	 	F
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 ::j$//4(( 	B9ACM$+,X6fe$$ 	L	 	 	 	==400\\F  0>BB62NN  *0022 $ $d####	  +*vMs2   $F 76D9-F 9D==F  D=AF BH))r[   r   r\   r5   r]   r   r+   r^   )
r[   r   r]   r   rh   r^   rE   ri   rC   rj   )r[   r   r]   r   )r[   r   r]   r   ru   r   )
__future__r   rK   copyr   typingr   r   r   fastapigradio_client.documentationr   r	   gradior
   gradio.data_classesr   gradio.exceptionsr   gradio.helpersr   gradio.routesr   r   rB   	ExceptionrZ   rg   rv   r   r   r@   r!   r   <module>r      s   " " " " " "        1 1 1 1 1 1 1 1 1 1  I I I I I I I I       + + + + + + # # # # # # $ $ $ $ $ $ "!!!!!!   ! ! !/" /" /" /" /" /" /" /"d 
0) 0) 0) 0) 0) 0) 0) 0)f	 	 	 	 		 	 	 	      2$ $ $ $89 9 9 9 9 9r!   