
    j.                        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mZm	Z	m
Z
mZmZmZmZ d dlZd dlZd dlmZmZ d dlmZmZmZ d dlmZ d dlZd dlmZ d dlmZmZmZm Z m!Z! d dl"m#Z# d d	l$ erd d
lm%Z% d dl&m'Z( d dl)m*Z* neZ%eZ(eZ*	 d dl+m,Z, dde, iZ. ej^                  dd      Z0	 	 d&deee1e2e3f      dedeeee1ef      ef   fdZ4	 d'dee5   dee6e2ejn                  f   fdZ8d Z9 G d dejt                        Z; G d d      Z< G d d      Z=	 	 d&d ee%e>f   d!ee1   d"ed#   de<fd$Z?d'd!ee1   de=fd%Z@y# e-$ r dZ,Y w xY w)(    N)	TYPE_CHECKINGAnyCallableDictListMappingOptionalTupleUnion)ClientSessionTCPConnector)USE_CLIENT_DEFAULTAsyncHTTPTransportHTTPTransport)RequestFiles)verbose_logger)_DEFAULT_TTL_FOR_HTTPX_CLIENTSAIOHTTP_CONNECTOR_LIMITAIOHTTP_KEEPALIVE_TIMEOUTAIOHTTP_TTL_DNS_CACHEDEFAULT_SSL_CIPHERS)track_llm_api_timing)*)LlmProviders)LoggingLiteLLMAiohttpTransport)versionz0.0.0z
User-Agentzlitellm/      @timeoutconnectdatacontentreturnc                 V    d}|}|  t        | t        t        f      r|| }||fS | }||fS )a  
    Helper function to route data/content parameters correctly for httpx requests
    
    This prevents httpx DeprecationWarnings that cause memory leaks.
    
    Background:
    - httpx shows a DeprecationWarning when you pass bytes/str to `data=`
    - It wants you to use `content=` instead for bytes/str
    - The warning itself leaks memory when triggered repeatedly
    
    Solution:
    - Move bytes/str from `data=` to `content=` before calling build_request
    - Keep dicts in `data=` (that's still the correct parameter for dicts)
    
    Args:
        data: Request data (can be dict, str, or bytes)
        content: Request content (raw bytes/str)
        
    Returns:
        Tuple of (request_data, request_content) properly routed for httpx
    N)
isinstancebytesstr)r#   r$   request_datarequest_contents       /Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/llms/custom_httpx/http_handler.py!_prepare_request_data_and_contentr-   2   sK    2 LOdUCL)"&
 ((  L((    
ssl_verifyc           
         ddl m} t        | t        j                        r| S | Bt        j                  dt        j                        } t        | t              r ||       n| }||} t        j                  dt        j                        }d}t        | t              r!t
        j                  j                  |       r| }|sMt        j                  d      }|r"t
        j                  j                  |      r|}nt        j                         }| durt        j                  |      }t        j                   j"                  |_        |r"t        |t              r|j'                  |       n|j'                  t(               t        j                  d	t        j*                        }|r<t        |t              r,	 |j-                  |       t/        j0                  d
|        |S |S | S # t2        $ rP t/        j4                  dt6        j8                  j;                         d    dt        j<                   d| d       Y |S t>        $ r'}t/        j4                  d| d| d       Y d}~|S d}~ww xY w)a  
    Unified SSL configuration function that handles ssl_context and ssl_verify logic.

    SSL Configuration Priority:
    1. If ssl_verify is provided -> is a SSL context use the custom SSL context
    2. If ssl_verify is False -> disable SSL verification (ssl=False)
    3. If ssl_verify is a string -> use it as a path to CA bundle file
    4. If SSL_CERT_FILE environment variable is set and exists -> use it as CA bundle file
    5. Else will use default SSL context with certifi CA bundle

    If ssl_security_level is set, it will apply the security level to the SSL context.

    Args:
        ssl_verify: SSL verification setting. Can be:
            - None: Use default from environment/litellm settings
            - False: Disable SSL verification
            - True: Enable SSL verification
            - str: Path to CA bundle file

    Returns:
        Union[bool, str, ssl.SSLContext]: Appropriate SSL configuration
    r   str_to_boolN
SSL_VERIFYSSL_SECURITY_LEVELSSL_CERT_FILEF)cafileSSL_ECDH_CURVEzSSL ECDH curve set to: z<SSL ECDH curve configuration not supported. Python version: z, OpenSSL version: z. Requested curve: z!. Continuing with default curves.zInvalid SSL ECDH curve name: 'z'. zp. Common valid curves: X25519, prime256v1, secp384r1, secp521r1. Continuing with default curves (including PQC).) litellm.secret_managers.mainr2   r'   ssl
SSLContextosgetenvlitellmr/   r)   ssl_security_levelpathexistscertifiwherecreate_default_context
TLSVersionTLSv1_2minimum_versionset_ciphersr   ssl_ecdh_curveset_ecdh_curver   debugAttributeErrorwarningsysr   splitOPENSSL_VERSION
ValueError)	r/   r2   ssl_verify_boolr>   r6   ssl_cert_filecustom_ssl_contextrH   es	            r,   get_ssl_configurationrU   Z   s5   2 9*cnn- YY|W-?-?@
'1*c'BK
#
 	 &(J#79S9STF*c"rww~~j'A		/2RWW^^M:"F]]_F 77vF .1^^-C-C* *-?"E**+=> **+>?
 #3W5K5KLj="11.A$$'>~>N%OP  "!!!# " &&''*{{'8'8':1'=&>>QRUReReQf g((6'77XZ "!  &&4^4DCs KF G  "!s   6)G% %AI,=I,I''I,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])r'   r)   find)error_message	key_index
next_parammasked_messages       r,   mask_sensitive_infor_      s    -%!&&v.	 B"''Y7
*?Y];>RRN  o	A.&'
,-  r.   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headersr$   )status_coder$   rg   )rb   requestresponse)r_   r)   ri   rf   super__init__rb   httpxRequestre   rg   r$   Responserj   rh   rc   )selforiginal_errorrb   rc   
masked_url	__class__s        r,   rl   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)   rl   __classcell__)rs   s   @r,   ra   ra      s(    SW'/}CKC= r.   ra   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	   dee   ded   f
d	Z	 	 d(deeeej                  f      deee	e
edef      f      dee   ded   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 e       	 	 	 	 	 	 	 	 	 d*de	deeee	ef      dee   dee   dee   deeeej                  f      dedee   dee   defd       Z	 	 	 	 	 	 	 d+de	deeee	ef      dee   dee   dee   deeeej                  f      dedefdZ	 	 	 	 	 	 	 d+de	deeee	ef      dee   dee   dee   deeeej                  f      dedefdZ	 	 	 	 	 	 	 d+de	deeee	ef      dee   dee   dee   deeeej                  f      dedefdZ	 	 	 	 	 	 d,de	dej                  deeee	ef      dee   dee   dee   dedefdZd-d Z e!	 	 	 d)d!ee"jF                     dee   ded   d
eee$e%f      fd"       Z&e!d
efd#       Z'e!	 	 d(dee   d!ee"jF                     d
e(e	ef   fd$       Z)e!	 	 	 d)dee   d!ee"jF                     ded   d
e$fd%       Z*e!d
ee%   fd&       Z+y).AsyncHTTPHandlerNr!   event_hooks.client_aliasr/   shared_sessionr   c                 b    || _         || _        | j                  ||||      | _        || _        y )N)r!   r{   r/   r}   )r!   r{   create_clientclientr|   )rp   r!   r{   concurrent_limitr|   r/   r}   s          r,   rl   zAsyncHTTPHandler.__init__   s@     &((#!)	 ) 
 )r.   r%   c           	      <   t        |      }t        j                  dt        j                        }|t
        }t        j                  t        |t        j                        r|nd t        |t              r|nd |      }t        j                  |||||t        d      S )NSSL_CERTIFICATEssl_contextr/   r}   T)	transportr{   r!   verifycertrg   follow_redirects)rU   r;   r<   r=   ssl_certificate_DEFAULT_TIMEOUTrz   _create_async_transportr'   r9   r:   boolrm   AsyncClientrg   )rp   r!   r{   r/   r}   
ssl_configr   r   s           r,   r   zAsyncHTTPHandler.create_client  s     +:6
 yy*G,C,CD?&G %<<&0S^^&L
RV%/
D%Azt) = 
	   #!
 	
r.   c                 T   K   | j                   j                          d {    y 7 wNr   acloserp   s    r,   closezAsyncHTTPHandler.close&       kk  """   (&(c                 "   K   | j                   S wr   r   r   s    r,   
__aenter__zAsyncHTTPHandler.__aenter__*  s     {{s   c                 T   K   | j                   j                          d {    y 7 wr   r   r   s    r,   	__aexit__zAsyncHTTPHandler.__aexit__-  r   r   rf   paramsrg   r   c                    K   ||nt         }|xs i }|j                  t        j                  |             | j                  j                  ||||       d {   }|S 7 wN)r   rg   r   )r   updateHTTPHandlerextract_query_paramsr   getrp   rf   r   rg   r   _follow_redirectsrj   s          r,   r   zAsyncHTTPHandler.get1  sm      !1 <BT 	 2k66s;<BS ) 
 
 
s   AA"A A"r#   jsonstreamlogging_objfilesr$   c                   K   t        j                          }	 || j                  }t        ||
      \  }}| j                  j	                  d|||||||	|	      }| j                  j                  ||       d {   }|j                          |S 7 # t        j                  t        j                  f$ ry | j                  || j                        }	 | j                  |||||||       d {  7  |j                          d {  7   cY S # |j                          d {  7   w xY wt        j                  $ r}t        j                          }t        ||z
  d      }i }t!        |dd       }|6|j"                  j%                         D ]  \  }}||dj'                  |      <    t)        j*                  d	| d
| ddd|      d }~wt        j,                  $ r}|du r]t/        |d|j0                  j3                          d {  7         t/        |d|j0                  j3                          d {  7         nTt/        |dt5        |j0                  j6                               t/        |dt5        |j0                  j6                               t/        |d|j0                  j8                         |d }~wt:        $ r}|d }~ww xY ww)NPOSTr#   r   r   rg   r!   r   r$   r   r!   r{   rf   r   r#   r   r   rg   r      rj   response_headers-{}z%Connection timed out. Timeout passed=z, time taken=z secondsdefault-model-namelitellm-httpx-handlerrb   modelllm_providerrg   Trb   rc   rh   )timer!   r-   r   build_requestsendraise_for_statusrm   RemoteProtocolErrorConnectErrorr   r{   single_connection_post_requestr   TimeoutExceptionroundgetattrrg   itemsformatr=   TimeoutHTTPStatusErrorsetattrrj   areadr_   rc   rh   	Exception)rp   rf   r#   r   r   rg   r!   r   r   r   r$   
start_timer*   r+   reqrj   
new_clientrT   end_time
time_deltaerror_responsekeyvalues                          r,   postzAsyncHTTPHandler.postE  s     YY[
A	,, -NdT[,\)L/++++!' , 
C "[[--c&-AAH%%'O B ))5+=+=> 	*++T-=-= , J*!@@%!#! A    !'')))j'')))%% 	yy{Hx*4a8JG$Q
D9N)"0"8"8">">"@JCAFG188=> #A //?yV`Uaaij*4	  $$ 
	~9AJJ,<,<,>&>&>?6)9)9);#;#;<9&9!**//&JK6#6qzz#GHA}ajj&<&<=G 	G	s   KA!B 9B:B KB A K
D.C1/D3K
D	K
KD*#D&
$D**K
?B
G		K
(J7H
-J75H86BJ77K
KK

Kc	           
      d  K   	 || j                   }t        ||      \  }	}
| j                  j                  d||	|||||
      }| j                  j	                  |       d {   }|j                          |S 7 # t        j                  t        j                  f$ ry | j                  || 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,                  j1                          d {  7         |t+        |d|j,                  j2                         |d }~wt4        $ r}|d }~ww xY ww)NPUTr#   r   r   rg   r!   r$   r   r   rj   r   Connection timed out after 	 seconds.r   r   r   rh   Trb   r!   r-   r   r   r   r   rm   r   r   r   r{   r   r   r   r   rg   r   r   r=   r   r   r   rj   rh   r   rc   r   rp   rf   r#   r   r   rg   r!   r   r$   r*   r+   r   rj   r   rT   r   r   r   s                     r,   putzAsyncHTTPHandler.put  s/    3	,, -NdT[,\)L/++++sDQXbi  tC , C "[[--c22H%%'O 3 ))5+=+=> 	*++T-=-= , 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	   H0AA; "A9#A; 8H09A; ;A H-<C8CC8H-/C20H-6H08DD
DH-(A$FH-"A	H+G.,.HH-&H((H--H0c	           
      d  K   	 || j                   }t        ||      \  }	}
| j                  j                  d||	|||||
      }| j                  j	                  |       d {   }|j                          |S 7 # t        j                  t        j                  f$ ry | j                  || 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,                  j1                          d {  7         |t+        |d|j,                  j2                         |d }~wt4        $ r}|d }~ww xY ww)NPATCHr   r   r   rj   r   r   r   r   r   r   rh   Trb   r   r   s                     r,   patchzAsyncHTTPHandler.patch  s/    3	,, -NdT[,\)L/++++<d6SZdk  vE , C "[[--c22H%%'O 3 ))5+=+=> 	*++T-=-= , 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	           
      t  K   	 || j                   }t        ||      \  }	}
| j                  j                  d||	|||||
      }| j                  j	                  ||       d {   }|j                          |S 7 # t        j                  t        j                  f$ ry | j                  || 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DELETEr   r   r   r   rh   Trb   )r!   r-   r   r   r   r   rm   r   r   r   r{   r   r   r   r   rj   rh   r   rc   r   )rp   rf   r#   r   r   rg   r!   r   r$   r*   r+   r   rj   r   rT   s                  r,   deletezAsyncHTTPHandler.delete  s    &	,, -NdT[,\)L/++++#LtFT[el  wF , C "[[--c&-AAH%%'O B ))5+=+=> 	*++T-=-= , J*!@@%!#! A    !'')))j'')))$$ 	A}ajj&<&<=~9AJJ,<,<,>&>&>? G 9ajjoo6G 	G	s   F8A A= $A;%A= :F8;A= =A F5>C:CC:F51C42F58F8:DD
DF5*A	F"3E64.F""F5.F00F55F8r   c	           	         K   t        ||      \  }	}
|j                  d||	||||
      }|j                  ||       d{   }|j                          |S 7 w)zz
        Making POST request for a single connection client.

        Used for retrying connection client errors.
        r   r#   r   r   rg   r$   r   N)r-   r   r   r   )rp   rf   r   r#   r   r   rg   r   r$   r*   r+   r   rj   s                r,   r   z/AsyncHTTPHandler.single_connection_post_requestJ  sm     " )J$PW(X%o""Clfg_n # 
  S88!!# 9s   >A AAc                     	 t        j                         j                  | j                                y # t        $ r Y y w xY wr   )asyncioget_running_loopcreate_taskr   r   r   s    r,   __del__zAsyncHTTPHandler.__del__d  s6    	$$&224::<@ 		s   14 	A A r   c                     t         j                         rt         j                  | ||      S t         j                         S )a  
        - Creates a transport for httpx.AsyncClient
            - if litellm.force_ipv4 is True, it will return AsyncHTTPTransport with local_address="0.0.0.0"
            - [Default] It will return AiohttpTransport
            - Users can opt out of using AiohttpTransport by setting litellm.use_aiohttp_transport to False


        Notes on this handler:
        - Why AiohttpTransport?
            - By default, we use AiohttpTransport since it offers much higher throughput and lower latency than httpx.

        - Why force ipv4?
            - Some users have seen httpx ConnectionError when using ipv6 - forcing ipv4 resolves the issue for them
        r   )rz   _should_use_aiohttp_transport_create_aiohttp_transport_create_httpx_transportr   s      r,   r   z(AsyncHTTPHandler._create_async_transportj  sB    . 99;#=='%- >    7799r.   c                      ddl } ddlm} t        j                  du s | | j
                  dd            du ryt        j                  d       y)	z
        AiohttpTransport is the default transport for litellm.

        Httpx can be used by the following
            - litellm.disable_aiohttp_transport = True
            - os.getenv("DISABLE_AIOHTTP_TRANSPORT") = "True"
        r   Nr1   TDISABLE_AIOHTTP_TRANSPORTFalseFzUsing AiohttpTransport...)r;   r8   r2   r=   disable_aiohttp_transportr<   r   rJ   )r;   r2   s     r,   r   z.AsyncHTTPHandler._should_use_aiohttp_transport  sL     	< --59299%@'JKtS
 	89r.   c                 V    dt         j                  rdndi}|||d<   |S | du rd|d<   |S )aq  
        Helper method to get SSL connector initialization arguments for aiohttp TCPConnector.

        SSL Configuration Priority:
        1. If ssl_context is provided -> use the custom SSL context
        2. If ssl_verify is False -> disable SSL verification (ssl=False)

        Returns:
            Dict with appropriate SSL configuration for TCPConnector
        
local_addr)0.0.0.0r   Nr9   F
verify_ssl)r=   
force_ipv4)r/   r   connector_kwargss      r,   _get_ssl_connector_kwargsz*AsyncHTTPHandler._get_ssl_connector_kwargs  sQ      G,>,>.D,
 "&1U#
  	 5 -2\*r.   c                    ddl m} ddlm} t        j                  | |      t        j                   |t        j                  dd            du rdt        j                  d       |7|j                  s+t        j                  d	t        |       d
        ||      S t        j                  d        |fd      S )z
        Creates an AiohttpTransport with RequestNotRead error handling

        Note: aiohttp TCPConnector ssl parameter accepts:
        - SSLContext: custom SSL context
        - False: disable SSL verification
        r   r   r1   )r/   r   AIOHTTP_TRUST_ENVr   TzCreating AiohttpTransport...z4SHARED SESSION: Reusing existing ClientSession (ID: )r   zDNEW SESSION: Creating new ClientSession (no shared session provided)c            
      R    t        t        dt        t        t        dd       S )NT)limitkeepalive_timeoutttl_dns_cacheenable_cleanup_closed)	connector	trust_env )r   r   r   r   r   )r   r   s   r,   <lambda>z<AsyncHTTPHandler._create_aiohttp_transport.<locals>.<lambda>  s2    =& 1&?"7*.	
 ' $	r.   )+litellm.llms.custom_httpx.aiohttp_transportr   r8   r2   rz   r   r=   aiohttp_trust_envr;   r<   r   rJ   closedid)r/   r   r}   r   r2   r   r   s        @@r,   r   z*AsyncHTTPHandler._create_aiohttp_transport  s     	X<+EE!{ F 
 "33	ryy!4g>?4GI;< %n.C.C  Fr.GYFZZ[\ +.AA 	R	
 '	
 	
r.   c                  <    t         j                  rt        d      S y)z
        Creates an AsyncHTTPTransport

        - If force_ipv4 is True, it will create an AsyncHTTPTransport with local_address set to "0.0.0.0"
        - [Default] If force_ipv4 is False, it will return None
        r   local_addressN)r=   r   r   r   r.   r,   r   z(AsyncHTTPHandler._create_httpx_transport  s     %I>>r.   )NNNNNNrt   NNN)	NNNNNFNNNNNNNNFN)NNNNFNr%   N),ru   rv   rw   r	   r   floatrm   r   r   r)   r   r   r   VerifyTypesrl   r   r   r   r   r   dictr   r   r   r(   LiteLLMLoggingObjectr   r   r   r   r   r   r   staticmethodr9   r:   r   r   r   r   r   r   r   r   r   r.   r,   rz   rz      s    :>HL&*,048)%u}} 456) gc4c0B+C&CDE)
 sm) [)) !1). -148 
%u}} 456 
 gc4c0B+C&CDE 
 [)	 

 !1 
 
		 
D## "&"&+/  $	
 #4.(  37#!%"&9=6:(,OO uT3-./O tn	O
 O $O %u}} 456O O 23O %O O Oh 37#!%"&9=>> uT3-./> tn	>
 > $> %u}} 456> > >F 37#!%"&9=>> uT3-./> tn	>
 > $> %u}} 456> > >F 37#!%"&9=11 uT3-./1 tn	1
 1 $1 %u}} 4561 1 1n 37#!%"& !! uT3-./	
 tn  $  4 04%)48 :cnn- :TN : !1 : 
%/1CCD	E	 :  :D 4  6 %)04 TN cnn-  
c3h   6 %)04482
TN2
cnn-2
 !12
 
!	2
 2
h 
X.@%A 
 
r.   rz   c                   0   e Zd Z	 	 	 	 ddeeeej                  f      deej                     deee	e
f      fdZd Z	 	 	 dde
dee   d	ee   d
ee	   fdZede
dee
e
f   fd       Z	 	 	 	 	 	 	 	 	 dde
de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eef      dedee   fdZ	 	 	 	 	 	 	 dde
de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      defdZ	 	 	 	 	 	 	 dde
de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      defdZ	 	 	 	 	 	 	 dde
deeee
ef      dee   dee   d	ee   deeeej                  f      de	defdZddZdee   fdZy) r   Nr!   r   r/   c                     |t         }t        |      }t        j                  dt        j
                        }|5| j                         }t        j                  ||||t        d      | _
        y || _
        y )Nr   T)r   r!   r   r   rg   r   )r   rU   r;   r<   r=   r   _create_sync_transportrm   Clientrg   r   )rp   r!   r   r   r/   r   r   r   s           r,   rl   zHTTPHandler.__init__	  ss     ?&G +:6
 yy*G,C,CD>335I  ,,#!!%DK !DKr.   c                 8    | j                   j                          y r   )r   r   r   s    r,   r   zHTTPHandler.close)  s    r.   rf   r   rg   r   c                     ||nt         }|xs i }|j                  | j                  |             | j                  j	                  ||||      }|S r   )r   r   r   r   r   r   s          r,   r   zHTTPHandler.get-  s_     !1 <BT 	 2d//45;;??BS # 
 r.   r%   c                 X    ddl m}m}  ||       }t         ||j                              S )u   
        Parse a URL’s query-string into a dict.

        :param url: full URL, e.g. "https://.../path?foo=1&bar=2"
        :return: {"foo": "1", "bar": "2"}
        r   )	parse_qslurlsplit)urllib.parser  r  r  query)rf   r  r  partss       r,   r   z HTTPHandler.extract_query_paramsA  s$     	5Iekk*++r.   r#   r   r   r   r$   r   c                 <   	 t        ||	      \  }}|%| 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   r   )r#   r   r   rg   r   r$   r   r   r   r   r   rb   r   r   Trb   rc   rh   r-   r   r   r   r   rm   r   r=   r   r   r   r_   rj   readrc   rh   r   )rp   rf   r#   r   r   rg   r   r!   r   r$   r   r*   r+   r   rj   rT   
error_texts                    r,   r   zHTTPHandler.postN  s   )	,MdT[,\)L/"kk//%!##+ 0 
 kk//ClfV]ej  uD 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&   BB
 
AFB=FFFFc	           
      8   	 t        ||      \  }	}
|$| 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   r   r   r   r   r   r   r   r  Trb   rc   rh   r  )rp   rf   r#   r   r   rg   r   r!   r$   r*   r+   r   rj   rT   r!  s                  r,   r   zHTTPHandler.patch  s   "	,MdT[,\)L/"kk//S|$vW^ho  zI 0  kk//S|$vW^hw 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	&   BB AF	B=FFFFc	           
      r   	 t        ||      \  }	}
|$| 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   r   r   r   r   r   r   r   r  )	r-   r   r   r   rm   r   r=   r   r   )rp   rf   r#   r   r   rg   r   r!   r$   r*   r+   r   rj   rT   s                 r,   r   zHTTPHandler.put  s    	,MdT[,\)L/"kk//3\VU\fm  xG 0  kk//3\VU\fu 0  {{''F';HO%% 	//5gYiH*4 
  	G	s   A5A8 87B6/B11B6c	           
      8   	 t        ||      \  }	}
|$| 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   r   r   r   r   r   r   r   r  Trb   rc   rh   r  )rp   rf   r#   r   r   rg   r!   r   r$   r*   r+   r   rj   rT   r!  s                  r,   r   zHTTPHandler.delete  s   "	,MdT[,\)L/"kk//c4X_ip  {J 0  kk//c4X_ix 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	r#  c                 D    	 | j                          y # t        $ r Y y w xY wr   )r   r   r   s    r,   r   zHTTPHandler.__del__  s"    	JJL 		s    	c                 \    t         j                  rt        d      S t        t         dd      S )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  sync_transportN)r=   r   r   r   r   s    r,   r  z"HTTPHandler._create_sync_transport  s(      y997$4d;;r.   )NNNNr	  )	NNNNFNNNN)NNNNFNNr
  r  )ru   rv   rw   r	   r   r  rm   r   r  r   r)   rl   r   r  r   r  r   r   r(   r   r   r   r  r   r   r   r   r   r   r  r   r.   r,   r   r     s    :>)-15!%u}} 456! &	!
 U49-.!@ "&"&+/  $	
 #4.( 
,# 
,$sCx. 
, 
, 3715!%"&9=596:66 uT3-./6 uT3_-.	6
 6 $6 6 %u}} 4566 dL0126 6 236v 37+/!%"&9=-- uT3-./- uT3Y'(	-
 - $- - %u}} 456- -d 37+/!%"&9=   uT3-./  uT3Y'(	 
   $    %u}} 456   J 37#!%"&9=-- uT3-./- tn	-
 - $- %u}} 456- - -^
<(? 
<r.   r   r   r   r}   r   c                 ~   d}|#|j                         D ]  \  }}	 || d| z  } d|z   | z   }t        j                  j	                  |      }|r|S |||d<   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_clientr}        @r   r    )r!   r}   r   r   ttlr   )
r   r   r=   in_memory_llm_clients_cache	get_cacherz   rm   r   	set_cacher   )	r   r   r}   _params_key_namer   r   _cache_key_name_cached_client_new_clients	            r,   get_async_httpx_clientr7    s      ,,.JC se1UG$44  ) +-==LO88BB?SN#1 &00&MM%=)

 ''11* 2 
 -  s   
B00	B<;B<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   r=   r0  r1  r   rm   r   r2  r   )r   r3  r   r   r4  r5  r6  s          r,   _get_httpx_clientr:  B  s      ,,.JC se1UG$44  ) %'77O88BB?SN!+F+!%--s*ST''11* 2 
 '  s   
B''	B32B3rt   r   )Ar   r;   r9   rM   r   typingr   r   r   r   r   r   r	   r
   r   rA   rm   aiohttpr   r   r   r   r   httpx._typesr   r=   litellm._loggingr   litellm.constantsr   r   r   r   r   (litellm.litellm_core_utils.logging_utilsr   litellm.types.llms.custom_httpr   *litellm.litellm_core_utils.litellm_loggingr   r  r  r   litellm._versionr   r   rg   r   r   r  r)   r(   r-   r  r   r:   rU   r_   r   ra   rz   r   httpxSpecialProviderr7  r:  r   r.   r,   <module>rE     s    	 
 
  \ \ \   / G G %  +  J ,$ TL!(
 HWI&
 !5==c:  /3%)
5sE)*
+%)%) 8E$-()3./%)R )-]%]
4cnn$%]@8E11 4U UpN< N<f "04&&::;&TN& _-& 	&Rhtn  w   Gs   
D> >EE