
    i%              	          U d 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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 ded	ee d
f   fdZ! e!e      Z"ee d
f   e#d<    e!e      Z$ee d
f   e#d<    G d de      Z%deejL                  ejN                  f   de	e ef   d	e	e ef   fdZ( G d d      Z) G d de      Z*	 	 	 ddee    dee    dee    d	e*fdZ+y)z3
Common helpers / utils across al OpenAI endpoints
    N)	TYPE_CHECKINGAnyDictListLiteral
NamedTupleOptionalTupleUnion)AsyncAzureOpenAIAsyncOpenAIAzureOpenAIOpenAI)ClientSession)BaseLLMException)_DEFAULT_TTL_FOR_HTTPX_CLIENTSAsyncHTTPHandlerget_ssl_configurationclsreturn.c                 t    t        d t        j                  | j                        j                  D              S )zAExtract __init__ parameter names (excluding 'self') from a class.c              3   ,   K   | ]  }|d k7  s	|  yw)selfN ).0ps     q/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/llms/openai/common_utils.py	<genexpr>z*_get_client_init_params.<locals>.<genexpr>(   s     VFq!v+Fs   
)tupleinspect	signature__init__
parameters)r   s    r   _get_client_init_paramsr$   &   s(    VG--cll;FFVVV    _OPENAI_INIT_PARAMS_AZURE_OPENAI_INIT_PARAMSc                        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POSThttps://api.openai.com/v1)methodurl)r*   r,   )r*   r+   r.   r,   r-   r/   )
r*   r+   r.   r,   httpxRequestr-   Responsesuperr"   )r   r*   r+   r,   r-   r.   r/   	__class__s          r   r"   zOpenAIError.__init__0   s     '"DL ==<WXDL$DM!NN'DM 	#LLLLLL]] 	 	
r%   )NNNN)__name__
__module____qualname__intstrr	   r5   r6   r7   r   dictHeadersr"   __classcell__)r9   s   @r   r)   r)   /   s~    
 ,0-18<#

 
 %--(	

 5>>*
 %emm 345
 tn
 
r%   r)   edatac                 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      )
isinstancer5   HTTPStatusErrorr-   jsongetr/   r?   r>   loadsJSONDecodeErrorr   lenlistappenditems)rB   rC   invalid_params
error_jsonerror_message
error_bodyr+   rF   
error_dictkvnew_datas               r   +drop_params_from_unprocessable_entity_errorr\   R   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                   6   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d
f   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azurer   c                 r    t         j                  | |      }t        j                  j	                  |      }|S )zbRetrieves the OpenAI client from the in-memory cache based on the client initialization parametersr_   r`   )r^   get_openai_client_cache_keylitellmin_memory_llm_clients_cache	get_cache)r_   r`   
_cache_key_cached_clients       r   get_cached_openai_clientz&BaseOpenAILLM.get_cached_openai_client   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 SECONDSrd   )keyvaluettlN)r^   re   rf   rg   	set_cacher   )rl   r`   r_   ri   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}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r`   =,)	rM   hashlibsha256encode	hexdigestr^   -get_openai_client_initialization_param_fieldsrR   join)	r_   r`   hashed_api_keyhash_object	key_partsLITELLM_CLIENT_SPECIFIC_PARAMSopenai_client_fieldsparamri   s	            r   re   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k(  rt         S t        S )zGReturns a tuple of fields that are used to initialize the OpenAI clientra   )r&   r'   r{   s    r   r   z;BaseOpenAILLM.get_openai_client_initialization_param_fields   s    
 ("&&,,r%   Nshared_sessionr   c           
      r   t         j                  t         j                  S t        t         dd      r!ddlm} t        j                   |             S t               }t        j                  |t        j                  t        |t        j                        r|nd t        |t              r|nd |       d      S )	Nnetwork_mockFr   MockOpenAITransport	transport)ssl_context
ssl_verifyr   T)verifyr   follow_redirects)rf   aclient_sessiongetattr(litellm.llms.custom_httpx.mock_transportr   r5   AsyncClientr   r   _create_async_transportrJ   ssl
SSLContextbool)r   r   
ssl_configs      r   _get_async_http_clientz$BaseOpenAILLM._get_async_http_client   s     "".***7NE2T$$/B/DEE +,
  &>>j#..9 ')3J)E:4- "

 
	
r%   c                      t         j                  t         j                  S t        t         dd      r!ddlm}  t        j                   |              S t               }t        j                  |d      S )Nr   Fr   r   r   T)r   r   )rf   client_sessionr   r   r   r5   Clientr   )r   r   s     r   _get_sync_http_clientz#BaseOpenAILLM._get_sync_http_client   s]    !!-)))7NE2T<<*=*?@@ +,
||!
 	
r%   )N)r:   r;   r<   __doc__staticmethodr?   r   r	   r   r   r   r   r   rk   rr   r>   re   r
   r   r5   r   r   r   r   r   r%   r   r^   r^      sP    	&*	9@AR9S		%[:JJK	L	 	 
V[+?OOP
./
 '+
 
  #&*#9@AR9S#	# #J -./-	sCx- - 48
 1
	%##	$
 
4 
8ELL#9 
 
r%   r^   c                   8    e Zd ZU eed<   ee   ed<   ee   ed<   y)OpenAICredentialsrz   rt   ry   N)r:   r;   r<   r>   __annotations__r	   r   r%   r   r   r     s    Mc]3-r%   r   rz   rt   ry   c                    | xsB t         j                  xs0 t        j                  d      xs t        j                  d      xs d}|xs, t         j                  xs t        j                  dd      xs d}|xs9 t         j
                  xs' t         j                  xs t        j                  d      }t        |||      S )zFResolve OpenAI credentials from params, litellm globals, and env vars.OPENAI_BASE_URLOPENAI_API_BASEr2   OPENAI_ORGANIZATIONNOPENAI_API_KEY)rz   rt   ry   )rf   rz   osgetenvry   rt   
openai_keyr   )rz   rt   ry   resolved_api_baseresolved_organizationresolved_api_keys         r   get_openai_credentialsr     s     	 	'	'99&'	' 99&'	' '  	 		99*D1	 	  	W7??Wg&8&8WBIIFV<W  " * r%   )NNN),r   r~   r    rL   r   r   typingr   r   r   r   r   r   r	   r
   r   r5   ra   r   r   r   r   aiohttpr   rf   )litellm.llms.base_llm.chat.transformationr   &litellm.llms.custom_httpx.http_handlerr   r   r   typer>   r$   r&   r   r'   r)   UnprocessableEntityErrorrK   r\   r^   r   r   r   r%   r   <module>r      sK      	 

 
 
   E E%  F W W%S/ W
 (?v'F U38_ F-D[-Q 5c? Q
" 
F-V,,e.C.CCD-
sCx.- 
#s(^-`}
 }
@ 
   #!"&smc] 3- 	r%   