
    j3                     (   d 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 ddlZddlZddlmZmZmZmZ e
rddlmZ ddlZddlmZ ddlmZmZmZ  G d d	e      Zd
eej8                  ej:                  f   deeef   deeef   fdZ G d d      Z y)z3
Common helpers / utils across al OpenAI endpoints
    N)AnyDictListLiteralOptionalTYPE_CHECKINGUnion)AsyncAzureOpenAIAsyncOpenAIAzureOpenAIOpenAI)ClientSession)BaseLLMException)_DEFAULT_TTL_FOR_HTTPX_CLIENTSAsyncHTTPHandlerget_ssl_configurationc                        e Zd Z	 	 	 	 ddededeej                     deej                     dee	e
ej                  f      dee
   f fdZ xZS )	OpenAIErrorstatus_codemessagerequestresponseheadersbodyc                 V   || _         || _        || _        |r|| _        nt	        j
                  dd      | _        |r|| _        n&t	        j                  || j                        | _        t        | %  || j                  | j                  | j                  | j                  |       y )NPOSTzhttps://api.openai.com/v1)methodurl)r   r   )r   r   r   r   r   r   )
r   r   r   r   httpxRequestr   Responsesuper__init__)selfr   r   r   r   r   r   	__class__s          y/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/llms/openai/common_utils.pyr#   zOpenAIError.__init__   s     '"DL ==<WXDL$DM!NN'DM 	#LLLLLL]] 	 	
    )NNNN)__name__
__module____qualname__intstrr   r   r    r!   r	   dictHeadersr#   __classcell__)r%   s   @r&   r   r      s~    
 ,0-18<#

 
 %--(	

 5>>*
 %emm 345
 tn
 
r'   r   edatareturnc                 b   g }t        | t        j                        r/| j                  j	                         }|j                  di       }|}n| j                  }|	t        |t              r|j                  d      r|j                  di       }t        |t              r	 t	        j                  |      }|j                  d      }t        |t              rt        |      dkD  rt        |d   t              rn|D ]i  }|j                  d      st        |j                  d      t              s5t        |j                  d            dk(  sS|j                  |d   d          k |j                         D 	
ci c]  \  }	}
|	|vs|	|
 }}	}
|S # t        j                  $ r d|i}Y w xY wc c}
}	w )a{  
    Helper function to read OpenAI UnprocessableEntityError and drop the params that raised an error from the error message.

    Args:
    e (UnprocessableEntityError): The UnprocessableEntityError exception
    data (Dict[str, Any]): The original data dictionary containing all parameters

    Returns:
    Dict[str, Any]: A new dictionary with invalid parameters removed
    errorr   detailr   loc      )
isinstancer   HTTPStatusErrorr   jsongetr   r-   r,   loadsJSONDecodeErrorr   lenlistappenditems)r0   r1   invalid_params
error_jsonerror_message
error_bodyr   r5   
error_dictkvnew_datas               r&   +drop_params_from_unprocessable_entity_errorrK   =   so    !#N!U**+ZZ__&
"w3"
VV
z4(NN9%..B/gs#.**W- X&fd#FaJvayRV<W$
NN5)":>>%#8$?JNN512a7"))*U*;A*>? % "&IA.1H1HIO '' .#W-. Js   F 7F+F+F('F(c                   2   e Zd ZdZededed   deee	e
eef      fd       Zedee	e
eef   ded   defd       Zededed   defd	       Zeded   dee   fd
       Ze	 dded   deej(                     fd       Zedeej,                     fd       Zy)BaseOpenAILLMzb
    Base class for OpenAI LLMs for getting their httpx clients and SSL verification settings
    client_initialization_paramsclient_type)openaiazurer2   c                 r    t         j                  | |      }t        j                  j	                  |      }|S )zbRetrieves the OpenAI client from the in-memory cache based on the client initialization parametersrN   rO   )rM   get_openai_client_cache_keylitellmin_memory_llm_clients_cache	get_cache)rN   rO   
_cache_key_cached_clients       r&   get_cached_openai_clientz&BaseOpenAILLM.get_cached_openai_clientr   s=    
 #>>)E# ? 

 !<<FFzRr'   openai_clientc                 ~    t         j                  ||      }t        j                  j	                  || t
               y)zZStores the OpenAI client in the in-memory cache for _DEFAULT_TTL_FOR_HTTPX_CLIENTS SECONDSrS   )keyvaluettlN)rM   rT   rU   rV   	set_cacher   )r[   rO   rN   rX   s       r&   set_cached_openai_clientz&BaseOpenAILLM.set_cached_openai_client~   sC     #>>)E# ? 

 	++55. 	6 	
r'   c                    d}| j                  d      Ct        j                  | j                  dd      j                               }|j	                         }d| d| j                  d       g}g d}t
        j                  |      |z   }|D ]'  }|j                  | d	| j                  |              ) d
j                  |      }|S )zWCreates a cache key for the OpenAI client based on the client initialization parametersNapi_key zhashed_api_key=z	is_async=is_async)timeoutmax_retriesorganizationapi_base)rO   =,)	r<   hashlibsha256encode	hexdigestrM   -get_openai_client_initialization_param_fieldsrA   join)	rN   rO   hashed_api_keyhash_object	key_partsLITELLM_CLIENT_SPECIFIC_PARAMSopenai_client_fieldsparamrX   s	            r&   rT   z)BaseOpenAILLM.get_openai_client_cache_key   s    
 '++I6B!..,00B?FFHK )224N n-.488DEF
	
*
& GG' H  -- 	 *Ewa(D(H(H(O'PQR * XXi(
r'   c                     ddl }ddlm}m} | dk(  r|j	                  |j
                        }n|j	                  |j
                        }|j                  D cg c]
  }|dk7  s	| }}|S c c}w )zFReturns a list of fields that are used to initialize the OpenAI clientr   N)r   r   rP   r$   )inspectrP   r   r   	signaturer#   
parameters)rO   ry   r   r   rz   rw   param_namess          r&   rp   z;BaseOpenAILLM.get_openai_client_initialization_param_fields   sl    
 	.("))&//:I))+*>*>?I +4*>*>R*>%6/u*>R Ss   
A*"A*Nshared_sessionr   c           
         t         j                  t         j                  S t               }t        j                  |t        j                  t        |t        j                        r|nd t        |t              r|nd |       d      S )N)ssl_context
ssl_verifyr}   T)verify	transportfollow_redirects)rU   aclient_sessionr   r   AsyncClientr   _create_async_transportr9   ssl
SSLContextbool)r}   
ssl_configs     r&   _get_async_http_clientz$BaseOpenAILLM._get_async_http_client   sv     "".*** +,
  &>>j#..9 ')3J)E:4- "

 
	
r'   c                      t         j                  t         j                  S t               } t        j                  | d      S )NT)r   r   )rU   client_sessionr   r   Client)r   s    r&   _get_sync_http_clientz#BaseOpenAILLM._get_sync_http_client   s;    !!-))) +,
||!
 	
r'   )N)r(   r)   r*   __doc__staticmethodr-   r   r   r	   r   r   r   r
   rZ   ra   r,   rT   r   rp   r   r   r   r   r    r'   r&   rM   rM   m   sL    	&*	9@AR9S		%[:JJK	L	 	 
V[+?OOP
./
 '+
 
  #&*#9@AR9S#	# #J ./	c " 48
 1
	%##	$
 
* 

8ELL#9 

 

r'   rM   )!r   rl   r;   r   typingr   r   r   r   r   r   r	   r   rP   r
   r   r   r   aiohttpr   rU   )litellm.llms.base_llm.chat.transformationr   &litellm.llms.custom_httpx.http_handlerr   r   r   r   UnprocessableEntityErrorr:   r,   rK   rM   r   r'   r&   <module>r      s      
 K K K   E E%  F 
" 
F-V,,e.C.CCD-
sCx.- 
#s(^-`{
 {
r'   