
    gX_                     v   d dl Z d dlZd dlmZmZmZmZmZmZm	Z	 d dl
Z
d dl
mZmZmZ d dlZd dl erd dlmZ neZ	 d dlmZ dd	e iZ e
j*                  d
d
      ZdZd Z G d de
j2                        Z G d d      Z G d d      Z	 dde	eef   dee   defdZddee   defdZ y# e$ r dZY sw xY w)    N)TYPE_CHECKINGAnyCallableListMappingOptionalUnion)USE_CLIENT_DEFAULTAsyncHTTPTransportHTTPTransport)*)LlmProviders)versionz0.0.0z
User-Agentzlitellm/      @timeoutconnecti  c                     t        | t              r| j                  d      }n| S |dk7  r7| j                  d|      }|dk(  r| d |dz    dz   }|S | d |dz    dz   | |d  z   }|S | S )Nzkey=&   z[REDACTED_API_KEY])
isinstancestrfind)error_message	key_index
next_parammasked_messages       [/var/www/openai/venv/lib/python3.12/site-packages/litellm/llms/custom_httpx/http_handler.pymask_sensitive_infor       s    -%!&&v.	 B"''Y7
*?Y];>RRN  o	A.&'
,-      c                   8     e Zd Z	 ddee   dee   f fdZ xZS )MaskedHTTPStatusErrormessagetextc           	         t        t        |j                  j                              }t        |   |j                  t        j                  |j                  j                  ||j                  j                  |j                  j                        t        j                  |j                  j                  |j                  j                  |j                  j                               || _        || _        y )N)methodurlheaderscontent)status_coder*   r)   )r$   requestresponse)r    r   r,   r(   super__init__r$   httpxRequestr'   r)   r*   Responser-   r+   r%   )selforiginal_errorr$   r%   
masked_url	__class__s        r   r/   zMaskedHTTPStatusError.__init__;   s     )^-C-C-G-G)HI
 	"**MM%--44&..66&..66	 ^^*33??&//77&//77 	 	
 	r!   )NN)__name__
__module____qualname__r   r   r/   __classcell__)r6   s   @r   r#   r#   :   s(    SW'/}CKC= r!   r#   c                      e Zd Z	 	 	 	 ddeeeej                  f      deee	e
edef      f      dee	   fdZdeeeej                  f      dedeee	e
edef      f      dej                  fd	Zd
 Zd Zd Z	 	 	 dde	dee   dee   dee   fdZ	 	 	 	 	 	 dde	deeee	f      dee   dee   dee   deeeej                  f      defdZ	 	 	 	 	 	 dde	deeee	f      dee   dee   dee   deeeej                  f      defdZ	 	 	 	 	 	 dde	deeee	f      dee   dee   dee   deeeej                  f      defdZ	 	 	 	 	 	 dde	deeee	f      dee   dee   dee   deeeej                  f      defdZ	 	 	 	 	 d de	dej                  deeee	f      dee   dee   dee   defdZd!dZdee   fdZy)"AsyncHTTPHandlerNr   event_hooks.client_aliasc                 `    || _         || _        | j                  |||      | _        || _        y )Nr   concurrent_limitr=   )r   r=   create_clientclientr>   )r3   r   r=   rA   r>   s        r   r/   zAsyncHTTPHandler.__init__U   s<     &((.>K ) 
 )r!   rA   returnc           	      ,   t        j                  dt        j                        }t        j                  dt        j                        }|t
        }| j                         }t        j                  |||t        j                  ||      ||t              S )N
SSL_VERIFYSSL_CERTIFICATEmax_connectionsmax_keepalive_connections)	transportr=   r   limitsverifycertr)   )osgetenvlitellm
ssl_verifyssl_certificate_DEFAULT_TIMEOUT_create_async_transportr0   AsyncClientLimitsr)   )r3   r   rA   r=   rR   rN   rK   s          r   rB   zAsyncHTTPHandler.create_clientc   s     YY|W-?-?@
 yy*G,C,CD?&G002	  #<< 0*: 
 	
r!   c                 T   K   | j                   j                          d {    y 7 wNrC   acloser3   s    r   closezAsyncHTTPHandler.close        kk  """   (&(c                 "   K   | j                   S wrY   )rC   r\   s    r   
__aenter__zAsyncHTTPHandler.__aenter__   s     {{s   c                 T   K   | j                   j                          d {    y 7 wrY   rZ   r\   s    r   	__aexit__zAsyncHTTPHandler.__aexit__   r^   r_   r(   paramsr)   follow_redirectsc                 t   K   ||nt         }| j                  j                  ||||       d {   }|S 7 wN)rd   r)   re   r
   rC   getr3   r(   rd   r)   re   _follow_redirectsr-   s          r   ri   zAsyncHTTPHandler.get   sM      !1 <BT 	 BS ) 
 
 
s   -868datajsonstreamc           
      
  K   	 || j                   }| j                  j                  d||||||      }| j                  j                  ||       d {   }	|	j	                          |	S 7 # t
        j                  t
        j                  f$ rz | j                  |d| j                        }
	 | j                  ||
|||||       d {  7  |
j                          d {  7   cY S # |
j                          d {  7   w xY wt
        j                  $ ri}i }t        |dd       }|6|j                  j                         D ]  \  }}||dj!                  |      <    t#        j$                  d	| d
dd|      d }~wt
        j&                  $ r}|du r]t)        |d|j*                  j-                          d {  7         t)        |d|j*                  j-                          d {  7         nTt)        |dt/        |j*                  j0                               t)        |dt/        |j*                  j0                               t)        |d|j*                  j2                         |d }~wt4        $ r}|d }~ww xY ww)NPOSTrl   rm   rd   r)   r   rn      r@   r(   rC   rl   rm   rd   r)   rn   r-   response_headers-{}Connection timed out after 	 seconds.default-model-namelitellm-httpx-handlerr$   modelllm_providerr)   Tr$   r%   r+   )r   rC   build_requestsendraise_for_statusr0   RemoteProtocolErrorConnectErrorrB   r=   single_connection_post_requestr[   TimeoutExceptiongetattrr)   itemsformatrQ   TimeoutHTTPStatusErrorsetattrr-   areadr    r%   r+   	Exceptionr3   r(   rl   rm   rd   r)   r   rn   reqr-   
new_clienteerror_responsekeyvalues                  r   postzAsyncHTTPHandler.post   sP    4	,,++++$T&'[b , C "[[--c&-AAH%%'O B ))5+=+=> 	*++!AQAQ , J*!@@%!#! A    !'')))j'')))%% 	G$Q
D9N)"0"8"8">">"@JCAFG188=> #A //5gYiH*4	  $$ 
	~9AJJ,<,<,>&>&>?6)9)9);#;#;<9&9!**//&JK6#6qzz#GHA}ajj&<&<=G 	G	s   JAA- A+A- *J+A- -AJ /C+
CC+J "C%#J )J+D?D
 DJ A$E??J (I-=G >-I-+G.,BI--J 9I;;J  Jc           
      F  K   	 || j                   }| j                  j                  d||||||      }| j                  j                  |       d {   }	|	j	                          |	S 7 # t
        j                  t
        j                  f$ rz | j                  |d| j                        }
	 | j                  ||
|||||       d {  7  |
j                          d {  7   cY S # |
j                          d {  7   w xY wt
        j                  $ ri}i }t        |dd       }|6|j                  j                         D ]  \  }}||dj!                  |      <    t#        j$                  d| d	d
d|      d }~wt
        j&                  $ r}}t)        |d|j*                  j,                         |du r0t)        |d|j*                  j/                          d {  7         |t)        |d|j*                  j0                         |d }~wt2        $ r}|d }~ww xY ww)NPUTrq   rs   r@   rt   r-   ru   rv   rw   rx   ry   rz   r+   Tr$   r   rC   r}   r~   r   r0   r   r   rB   r=   r   r[   r   r   r)   r   r   rQ   r   r   r   r-   r+   r   r%   r   r   s                  r   putzAsyncHTTPHandler.put   s    0	,,++++sDZa , C "[[--c22H%%'O 3 ))5+=+=> 	*++!AQAQ , J*!@@%!#! A    !'')))j'')))%% 	G$Q
D9N)"0"8"8">">"@JCAFG188=> #A //5gYiH*4	  $$ 	A}ajj&<&<=~9AJJ,<,<,>&>&>? G 9ajjoo6G 	G	   H!AA+ A)A+ (H!)A+ +AH-C)C	C)H C#!H'H!)D=D 
>DHA$E==HA	HG.HHHHH!c           
      F  K   	 || j                   }| j                  j                  d||||||      }| j                  j                  |       d {   }	|	j	                          |	S 7 # t
        j                  t
        j                  f$ rz | j                  |d| j                        }
	 | j                  ||
|||||       d {  7  |
j                          d {  7   cY S # |
j                          d {  7   w xY wt
        j                  $ ri}i }t        |dd       }|6|j                  j                         D ]  \  }}||dj!                  |      <    t#        j$                  d| d	d
d|      d }~wt
        j&                  $ r}}t)        |d|j*                  j,                         |du r0t)        |d|j*                  j/                          d {  7         |t)        |d|j*                  j0                         |d }~wt2        $ r}|d }~ww xY ww)NPATCHrq   rs   r@   rt   r-   ru   rv   rw   rx   ry   rz   r+   Tr$   r   r   s                  r   patchzAsyncHTTPHandler.patch  s    0	,,++++4d67\c , C "[[--c22H%%'O 3 ))5+=+=> 	*++!AQAQ , J*!@@%!#! A    !'')))j'')))%% 	G$Q
D9N)"0"8"8">">"@JCAFG188=> #A //5gYiH*4	  $$ 	A}ajj&<&<=~9AJJ,<,<,>&>&>? G 9ajjoo6G 	G	r   c           
      V  K   	 || j                   }| j                  j                  d||||||      }| j                  j                  ||       d {   }	|	j	                          |	S 7 # t
        j                  t
        j                  f$ rz | j                  |d| j                        }
	 | j                  ||
|||||       d {  7  |
j                          d {  7   cY S # |
j                          d {  7   w xY wt
        j                  $ r}}t        |d|j                  j                         |du r0t        |d	|j                  j!                          d {  7         |t        |d	|j                  j"                         |d }~wt$        $ r}|d }~ww xY ww)
NDELETErq   rr   rs   r@   rt   r+   Tr$   )r   rC   r}   r~   r   r0   r   r   rB   r=   r   r[   r   r   r-   r+   r   r%   r   )r3   r(   rl   rm   rd   r)   r   rn   r   r-   r   r   s               r   deletezAsyncHTTPHandler.deleteW  s    "	,,++++#DtFG]d , C "[[--c&-AAH%%'O B ))5+=+=> 	*++!AQAQ , J*!@@%!#! A    !'')))j'')))$$ 	A}ajj&<&<=~9AJJ,<,<,>&>&>? G 9ajjoo6G 	G	s   F)AA- A+A- *F)+A- -AF&/C+
CC+F&"C%#F&)F)+D?D
 DF&A	F$E'%.FF&F!!F&&F)rC   c                    K   |j                  d|||||      }|j                  ||       d{   }	|	j                          |	S 7 w)zz
        Making POST request for a single connection client.

        Used for retrying connection client errors.
        rp   rl   rm   rd   r)   rr   N)r}   r~   r   )
r3   r(   rC   rl   rm   rd   r)   rn   r   r-   s
             r   r   z/AsyncHTTPHandler.single_connection_post_request  sW      ""Cdfg # 
  S88!!# 9s   .A	AA	c                     	 t        j                         j                  | j                                y # t        $ r Y y w xY wrY   )asyncioget_running_loopcreate_taskr]   r   r\   s    r   __del__zAsyncHTTPHandler.__del__  s6    	$$&224::<@ 		s   14 	A A c                 <    t         j                  rt        d      S y)z
        Create an async transport with IPv4 only if litellm.force_ipv4 is True.
        Otherwise, return None.

        Some users have seen httpx ConnectionError when using ipv6 - forcing ipv4 resolves the issue for them
        0.0.0.0local_addressN)rQ   
force_ipv4r   r\   s    r   rU   z(AsyncHTTPHandler._create_async_transport  s     %I>>r!   )NN  NNNN)NNNNNF)NNNNFrD   N)r7   r8   r9   r   r	   floatr0   r   r   r   r   r   r   r/   intrV   rB   r]   ra   rc   dictboolri   r   r   r   r   r   r   r   rU    r!   r   r<   r<   T   s    :>HL&*)%u}} 456) gc4c0B+C&CDE)
 sm)
%u}} 456
 
 gc4c0B+C&CDE	

 
		
@## "&"&+/  $	
 #4.( ,0#!%"&9=>> uT3Y'(> tn	>
 > $> %u}} 456> >F ,0#!%"&9=:: uT3Y'(: tn	:
 : $: %u}} 456: :~ ,0#!%"&9=:: uT3Y'(: tn	:
 : $: %u}} 456: :~ ,0#!%"&9=,, uT3Y'(, tn	,
 , $, %u}} 456, ,d ,0#!%"& !! uT3Y'(	
 tn  $ ,
2D)E 
r!   r<   c                   N   e Zd Z	 	 	 ddeeeej                  f      deej                     fdZ	d Z
	 	 	 ddedee   dee   d	ee   fd
Z	 	 	 	 	 	 	 	 ddedeeeef      deeeeef      dee   dee   dedeeeej                  f      dee   defdZ	 	 	 	 	 	 ddedeeeef      deeeef      dee   dee   dedeeeej                  f      fdZ	 	 	 	 	 	 ddedeeeef      deeeef      dee   dee   dedeeeej                  f      fdZddZdee   fdZy)HTTPHandlerNr   rC   c                 J   |t         }t        j                  dt        j                        }t        j                  dt        j
                        }|J| j                         }t        j                  ||t        j                  ||      ||t              | _        y || _        y )NrF   rG   rH   )rK   r   rL   rM   rN   r)   )rT   rO   rP   rQ   rR   rS   _create_sync_transportr0   ClientrW   r)   rC   )r3   r   rA   rC   rR   rN   rK   s          r   r/   zHTTPHandler.__init__  s     ?&G YY|W-?-?@
 yy*G,C,CD>335I  ,,#||$4.> "
DK !DKr!   c                 8    | j                   j                          y rY   )rC   r]   r\   s    r   r]   zHTTPHandler.close  s    r!   r(   rd   r)   re   c                 X    ||nt         }| j                  j                  ||||      }|S rg   rh   rj   s          r   ri   zHTTPHandler.get  s?     !1 <BT 	 ;;??BS # 
 r!   rl   rm   rn   filesr*   c
                    	 |%| j                   j                  d||||||||		      }
n#| j                   j                  d|||||||	      }
| j                   j                  |
|      }|j                          |S # t        j
                  $ r t        j                  d| ddd	      t        j                  $ r}|d
u r]t        |dt        |j                  j                                      t        |dt        |j                  j                                      n9t        |j                  j                        }t        |d|       t        |d|       t        |d|j                  j                         |d }~wt        $ r}|d }~ww xY w)Nrp   )rl   rm   rd   r)   r   r   r*   )rl   rm   rd   r)   r   r*   rr   rv   rw   rx   ry   r$   r{   r|   Tr$   r%   r+   rC   r}   r~   r   r0   r   rQ   r   r   r   r    r-   readr%   r+   r   )r3   r(   rl   rm   rd   r)   rn   r   r   r*   r   r-   r   
error_texts                 r   r   zHTTPHandler.post  sw    	"kk//Cdfg_fns  ~E 0  kk//Cdfg]bls 0  {{''F';H%%'O%% 	//5gYiH*4 
 $$ 	~9&9!**//:K&LM6#6qzz7H#IJ0A
9j16:.A}ajj&<&<=G 	G	s&   A8A; ;AF<B=E99FFFc           	         	 |#| j                   j                  d||||||      }n!| j                   j                  d|||||      }| j                   j                  ||      }	|	j                          |	S # t        j
                  $ r t        j                  d| ddd	      t        j                  $ r}
|d
u r]t        |
dt        |
j                  j                                      t        |
dt        |
j                  j                                      n9t        |
j                  j                        }t        |
d|       t        |
d|       t        |
d|
j                  j                         |
d }
~
wt        $ r}
|
d }
~
ww xY w)Nr   rq   r   rr   rv   rw   rx   ry   r   Tr$   r%   r+   r   )r3   r(   rl   rm   rd   r)   rn   r   r   r-   r   r   s               r   r   zHTTPHandler.patch  sg   !	"kk//St$vw`g 0  kk//St$vw 0  {{''F';H%%'O%% 	//5gYiH*4 
 $$ 	~9&9!**//:K&LM6#6qzz7H#IJ0A
9j16:.A}ajj&<&<=G 	G	s&   A4A7 7AF8B=E55FFFc           	      P   	 |#| j                   j                  d||||||      }n!| j                   j                  d|||||      }| j                   j                  ||      }	|	S # t        j                  $ r t        j                  d| ddd	      t        $ r}
|
d }
~
ww xY w)
Nr   rq   r   rr   rv   rw   rx   ry   r   )rC   r}   r~   r0   r   rQ   r   r   )r3   r(   rl   rm   rd   r)   rn   r   r   r-   r   s              r   r   zHTTPHandler.putA  s    	"kk//3TVW^e 0  kk//3TVW 0  {{''F';HO%% 	//5gYiH*4 
  	G	s   A$A' '7B%B  B%rD   c                 D    	 | j                          y # t        $ r Y y w xY wrY   )r]   r   r\   s    r   r   zHTTPHandler.__del__`  s"    	JJL 		s    	c                 <    t         j                  rt        d      S y)z
        Create an HTTP transport with IPv4 only if litellm.force_ipv4 is True.
        Otherwise, return None.

        Some users have seen httpx ConnectionError when using ipv6 - forcing ipv4 resolves the issue for them
        r   r   N)rQ   r   r   r\   s    r   r   z"HTTPHandler._create_sync_transportf  s      y99r!   )Nr   Nr   )NNNNFNNN)NNNNFNr   )r7   r8   r9   r   r	   r   r0   r   r   r/   r]   r   r   r   ri   r   r   r   r   r   r   r   r   r   r!   r   r   r     s|    :>)-	 !%u}} 456 ! &	 !D "&"&+/  $	
 #4.( ,015!%"&9= $,, uT3Y'(, uT3_-.	,
 , $, , %u}} 456, ~, ,b ,0+/!%"&9=++ uT3Y'(+ uT3Y'(	+
 + $+ + %u}} 456+` ,0+/!%"&9= uT3Y'( uT3Y'(	
  $  %u}} 456>
(? 
r!   r   r|   rd   rD   c                 r   d}|#|j                         D ]  \  }}	 || d| z  } d|z   | z   }t        j                  j	                  |      }|r|S |t        d	i |}n!t        t        j                  dd            }t        j                  j                  ||t               |S # t        $ r Y w xY w)
z
    Retrieves the async HTTP client from the cache
    If not present, creates a new client

    Caches the new client and returns it.
     _async_httpx_client     @r   r   r   r   r   ttlr   )
r   r   rQ   in_memory_llm_clients_cache	get_cacher<   r0   r   	set_cache_DEFAULT_TTL_FOR_HTTPX_CLIENTS)r|   rd   _params_key_namer   r   _cache_key_name_cached_client_new_clients           r   get_async_httpx_clientr   s  s      ,,.JC se1UG$44  ) +-==LO88BB?SN&00&MM%=
 ''11* 2 
 '  s   
B**	B65B6c                 l   d}| #| j                         D ]  \  }}	 || d| z  } d|z   }t        j                  j	                  |      }|r|S | t        d	i | }n!t        t        j                  dd            }t        j                  j                  ||t               |S # t        $ r Y w xY w)
z
    Retrieves the HTTP client from the cache
    If not present, creates a new client

    Caches the new client and returns it.
    r   r   httpx_clientr   r   r   r   r   r   )
r   r   rQ   r   r   r   r0   r   r   r   )rd   r   r   r   r   r   r   s          r   _get_httpx_clientr     s      ,,.JC se1UG$44  ) %'77O88BB?SN!+F+!%--s*ST''11* 2 
 %  s   
B''	B32B3rY   )!r   rO   typingr   r   r   r   r   r   r	   r0   r
   r   r   rQ   litellm.types.llms.custom_httpr   litellm._versionr   r   r)   r   rT   r   r    r   r#   r<   r   httpxSpecialProviderr   r   r   r   r!   r   <module>r      s     	 O O O  G G  ,$L(
 HWI&
 !5==c: !% 8E11 4W Wt
B BN ""&::;"TN" "Jhtn  M  Gs   B. .B87B8