
    h3i                        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 d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ  e       Z G d de      Z dee
jB                  e"f   de"fdZ#	 d#de$de$de$de$deg e$f   f
dZ%	 d#de$de$de$de$deg e$f   f
dZ&	 d$de$dee$   dee$   dee$   de$f
dZ'de"fdZ(dedee$   fd Z) G d! d"e      Z*y)%    N)AnyCallableDictLiteralOptionalUnioncast)AsyncAzureOpenAIAzureOpenAI)verbose_logger)	DualCache)BaseLLMException)BaseOpenAILLM)get_azure_ad_token_provider)get_secret_str)GenericLiteLLMParams)_add_path_to_api_basec            
            e Zd Z	 	 	 	 ddeej
                     deej                     deeej                  e	f      dee	   f fdZ
 xZS )AzureOpenAIErrorrequestresponseheadersbodyc                 0    t         |   ||||||       y )N)status_codemessager   r   r   r   )super__init__)selfr   r   r   r   r   r   	__class__s          [/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/azure/common_utils.pyr   zAzureOpenAIError.__init__   s)     	# 	 	
    )NNNN)__name__
__module____qualname__r   httpxRequestResponser   Headersdictr   __classcell__)r    s   @r!   r   r      sl    
 ,0-18<#
 %--(	

 5>>*
 %t 345
 tn
 
r"   r   r   returnc                     i }d| v r| d   |d<   d| v r| d   |d<   d| v r| d   |d<   d| v r| d   |d<   | j                         D ci c]  \  }}dj                  d|      | }}}i ||S c c}}w )Nzx-ratelimit-limit-requestszx-ratelimit-remaining-requestszx-ratelimit-limit-tokenszx-ratelimit-remaining-tokensz{}-{}llm_provider)itemsformat)r   openai_headerskvllm_response_headerss        r!   process_azure_headersr5   +   s    N#w.7>(8
34 (72;B,<
78 "W,5<=W5X12%09@*:
56 :A15A~q)1,  6"5n55	s   A,	tenant_id	client_idclient_secretscopec                    ddl m}m} t        j                  d       | j                  d      rt        |       }n| }|j                  d      rt        |      }n|}|j                  d      rt        |      }n|}t        j                  d|||       |||t        d       ||||      }	t        j                  d|	        ||	|      }
t        j                  d|
       |
S )	z
    Get Azure AD token provider from `client_id`, `client_secret`, and `tenant_id`

    Args:
        tenant_id: str
        client_id: str
        client_secret: str
        scope: str

    Returns:
        callable that returns a bearer token.
    r   )ClientSecretCredentialget_bearer_token_providerz$Getting Azure AD Token from Entra IDzos.environ/z,tenant_id %s, client_id %s, client_secret %sz8tenant_id, client_id, and client_secret must be providedcredential %stoken_provider %s)azure.identityr;   r<   r   debug
startswithr   
ValueError)r6   r7   r8   r9   r;   r<   
_tenant_id
_client_id_client_secret
credentialtoken_providers              r!    get_azure_ad_token_from_entra_idrH   B   s    $ Q?@M*#I.

M*#I.

.'6&6	 Z/>3ISTT'
JOJ*5.z5AN,n=r"   azure_usernameazure_passwordc                     ddl m}m} t        j                  d| ||        || ||      }t        j                  d|        |||      }t        j                  d|       |S )a  
    Get Azure AD token provider from `client_id`, `azure_username`, and `azure_password`

    Args:
        client_id: str
        azure_username: str
        azure_password: str
        scope: str

    Returns:
        callable that returns a bearer token.
    r   )UsernamePasswordCredentialr<   z2client_id %s, azure_username %s, azure_password %s)r7   usernamepasswordr=   r>   )r?   rL   r<   r   r@   )r7   rI   rJ   r9   rL   r<   rF   rG   s           r!   )get_azure_ad_token_from_username_passwordrO   z   sl    $ U<	 ,J *5.z5AN,n=r"   azure_ad_tokenazure_client_idazure_tenant_idc           	         |d}t        j                  dd      }|xs t        j                  d      }|xs t        j                  d      }||t        dd	      t        |       }|t        d
d	      t	        j
                  ||||d      }t        j                  |      }||S t        j                  }|j                  | d| d|d|d|d      }	|	j                  dk7  r!t        |	j                  |	j                  	      |	j	                         }
|
j                  dd      }|
j                  dd      }|t        dd	      |t        dd	      t        j                  |||       |S )z
    Get Azure AD token from OIDC token

    Args:
        azure_ad_token: str
        azure_client_id: Optional[str]
        azure_tenant_id: Optional[str]
        scope: str

    Returns:
        `azure_ad_token_access_token` - str
    N,https://cognitiveservices.azure.com/.defaultAZURE_AUTHORITY_HOSTz!https://login.microsoftonline.comAZURE_CLIENT_IDAZURE_TENANT_IDi  z/AZURE_CLIENT_ID and AZURE_TENANT_ID must be set)r   r   i  z6OIDC token could not be retrieved from secret manager.)rQ   rR   azure_authority_host
oidc_token/z/oauth2/v2.0/tokenclient_credentialsz6urn:ietf:params:oauth:client-assertion-type:jwt-bearer)r7   
grant_typer9   client_assertion_typeclient_assertion)data   access_token
expires_inz(Azure AD Token access_token not returnedz&Azure AD Token expires_in not returned)keyvaluettl)osgetenvr   r   jsondumpsazure_ad_cache	get_cachelitellmmodule_level_clientpostr   textget	set_cache)rP   rQ   rR   r9   rX   rY   azure_ad_token_cache_keyazure_ad_token_access_tokenclient	req_tokenazure_ad_token_jsonazure_ad_token_expires_ins               r!   get_azure_ad_token_from_oidcrx      s   $ }>99 C &E3D)EO%E3D)EO/"9E
 	

  /JL
 	

  $zz..$8$		
  #1":":;S"T".**((F
 /!22DE(.%] *
  	I #!--NN
 	

 $..*"5"9"9.$"O 3 7 7d K"*%O
 	
 !(%M
 	
 $)%   '&r"   azure_client_paramsc                 b    | j                  dd       }|d|v r|| d<   | j                  d       | S )Nazure_endpointz/openai/deploymentsbase_url)rp   pop)ry   r{   s     r!   !select_azure_base_url_or_endpointr~     sC    (,,-=tDN! N2.<
+##$45r"   litellm_paramsc                    | j                  d      }| j                  dd      xs t        d      }| j                  dt        j                  d            }| j                  dt        j                  d            }| j                  d	t        j                  d
            }| j                  dt        j                  d            }| j                  dt        j                  d            }| j                  dt        j                  dd            }|d}|*|r(|r&|r$t	        j
                  d       t        ||||      }|*|r(|r&|r$t	        j
                  d       t        ||||      }|r:|r8|r6|j                  d      r%t	        j
                  d       t        ||||      }nP|Nt        j                  du r<t	        j
                  d       	 t        |      }||t        j                  |      }|r`t!        |      rU	  |       }	t#        |	t$              s8t	        j&                  dt)        |	              t+        dt)        |	             |	}	 |S |S # t        $ r t	        j
                  d       Y w xY w# t*        $ r  t,        $ r>}
t	        j&                  d t%        |
              t/        d!t%        |
             |
d}
~
ww xY w)"a  
    Get Azure AD token from various authentication methods.

    This function tries different methods to obtain an Azure AD token:
    1. From an existing token provider
    2. From Entra ID using tenant_id, client_id, and client_secret
    3. From username and password
    4. From OIDC token
    5. From a service principal with secret workflow
    6. From DefaultAzureCredential

    Args:
        litellm_params: Dictionary containing authentication parameters
            - azure_ad_token_provider: Optional callable that returns a token
            - azure_ad_token: Optional existing token
            - tenant_id: Optional Azure tenant ID
            - client_id: Optional Azure client ID
            - client_secret: Optional Azure client secret
            - azure_username: Optional Azure username
            - azure_password: Optional Azure password

    Returns:
        Azure AD token as string if successful, None otherwise
    azure_ad_token_providerrP   NAZURE_AD_TOKENr6   rW   r7   rV   r8   AZURE_CLIENT_SECRETrI   AZURE_USERNAMErJ   AZURE_PASSWORDazure_scopeAZURE_SCOPErT   :Using Azure AD Token Provider from Entra ID for Azure Authr6   r7   r8   r9   0Using Azure Username and Password for Azure AuthrI   rJ   r7   r9   oidc/%Using Azure OIDC Token for Azure AuthrP   rQ   rR   r9   TzvUsing Azure AD token provider based on Service Principal with Secret workflow or DefaultAzureCredential for Azure Authr   *Azure AD Token Provider could not be used.)r9   z3Azure AD token provider returned non-string value: z%Azure AD token must be a string, got z'Error calling Azure AD token provider: zFailed to get Azure AD token: )rp   r   rf   rg   r   r@   rH   rO   rA   rx   rl   enable_azure_ad_token_refreshr   rB   BaseAzureLLM*_try_get_default_azure_credential_providercallable
isinstancestrerrortype	TypeError	ExceptionRuntimeError)r   r   rP   r6   r7   r8   rI   rJ   r9   tokenes              r!   get_azure_ad_tokenr     s   8 -001JK#''(8$? >DN "";		:K0LMI"";		:K0LMI"&&#89M $''(8"))DT:UVN#''(8"))DT:UVN
		-!OPE }> &9}H	
 #C'	#
 	 'OP"K))	#
 	%%g.DE5)%%	
 	 '11T9 E	
	O&Ae&T# #*~/E&2&]&] '^ '#
 8,C#D	Q+-EeS)$$I$u+W  "GU} UVV!& >=  	O  !MN	O.  	 	Q  #J3q6(!ST!?AxHIqP	Qs+   I AJ  I=<I= K9KKc                       e Zd Zededeeg ef      fd       Z	 	 	 	 	 ddee   dee   dee   deee	e
f      d	ee   d
edee   deee	e
f      fdZd	edee   dee   dee   dee   dedefdZ	 ddededededeeej$                  f   d	edee   dee   deeg ef      dedeee	e
f      dee	e
f   fdZeded	ee   defd       Zedee   d	eeeeeef   f      ded   defd       Zedee   defd       Zy)r   r9   r,   c                    ddl m} t        j                  d       	 t	        | |j
                        }t        j                  d       |S # t        $ r+}t        j                  dt        |              Y d}~yd}~ww xY w)a  
        Try to get DefaultAzureCredential provider
        
        Args:
            scope: Azure scope for the token
            
        Returns:
            Token provider callable if DefaultAzureCredential is enabled and available, None otherwise
        r   )AzureCredentialTypez7Attempting to use DefaultAzureCredential for Azure Auth)r   azure_credentialzJSuccessfully obtained Azure AD token provider using DefaultAzureCredentialzDefaultAzureCredential failed: N)9litellm.types.secret_managers.get_azure_ad_token_providerr   r   r@   r   DefaultAzureCredentialr   r   )r9   r   r   r   s       r!   r   z7BaseAzureLLM._try_get_default_azure_credential_provider  sz    	
 	E	
		&A!!4!K!K'#   !mn** 	  #B3q6(!KL	s   -A 	A?!A::A?Napi_keyapi_baseapi_versionrt   r   	_is_asyncmodelc                    d }t               }	||	d<   |n| j                  |	d      }
|
r"t        |
t              st        |
t              r|
S | j                  |xs i |||||      }|du rt	        di |}nFt        di |}n:|}|6t        |j                  t              r|j                  j                  d|       | j                  ||	d       |S )	Nis_asyncazure)client_initialization_paramsclient_type)r   r   r   
model_namer   r   Tapi-version)openai_clientr   r    )
localsget_cached_openai_clientr   r   r
   initialize_azure_sdk_client_custom_queryr*   
setdefaultset_cached_openai_client)r   r   r   r   rt   r   r   r   r   r   cached_clientry   s               r!   get_azure_openai_clientz$BaseAzureLLM.get_azure_openai_client  s    IM-3X$3<$Z0> 99-I# : M m[9Z!#3> )("&"B"B-3! '" #C # D  0 G3F G + B.A B"M&:++T, ++66}kR 	%%')E 	& 	

 r"   r   r   c                    |j                  d      }|j                  d      }|j                  dt        j                  d            }	|j                  dt        j                  d            }
|j                  dt        j                  d            }|j                  d	t        j                  d
            }|j                  dt        j                  d            }|j                  dt        j                  dd            }|d}|j                  d      }|j                  d      }|s,|*|	r(|
r&|r$t        j                  d       t        |	|
||      }|*|r(|r&|
r$t        j                  d       t        |||
|      }|6|j                  d      r%t        j                  d       t        ||
|	|      }n8|s6|4t        j                  du r"t        j                  d       	 t        |      }|$t        j                  dt        j                        }|}|t        |t              r|d d dz   }t        j                  d | d!t        |       d"|        |||||d#}|du r| j!                         |d$<   n| j#                         |d$<   |||d<   |||d<   |||d<   t%        |%      }|S # t        $ r t        j                  d       Y w xY w)&Nr   rP   r6   rW   r7   rV   r8   r   rI   r   rJ   r   r   r   rT   max_retriestimeoutr   r   r   r   r   r   r   Tz\Using Azure AD token provider based on Service Principal with Secret workflow for Azure Authr   r   AZURE_API_VERSION   z***************z%Initializing Azure OpenAI Client for z, Api Base: z
, Api Key:)r   r{   r   rP   r   http_client)ry   )rp   rf   rg   r   r@   rH   rO   rA   rx   rl   r   r   rB   AZURE_DEFAULT_API_VERSIONr   r   _get_async_http_client_get_sync_http_clientr~   )r   r   r   r   r   r   r   r   rP   r6   r7   r8   rI   rJ   r9   r   r   _api_keyry   s                      r!   r   z(BaseAzureLLM.initialize_azure_sdk_client  s(    #1"4"45N"O'++,<="&&{BII>O4PQ	"&&{BII>O4PQ	&**RYY'<=
 (++bii(89
 (++bii(89
 ""IIm%ST
 =BE$((7 $$Y/'/  L 'G##+	'# $+  !ST&O--#	'# %.*C*CG*L  !HI9- ) )	N '/55=  nS*ERW*X' ))#W%F%FK Jx$=|h.H3J<|CPXM?Zdemdno	
 &&,'>
 t151L1L1N.151K1K1M."1<.-4	*".=T 9: @ 3
 #"S  S$$%QRSs   &J1 1KKr   r   rP   r   acompletionc                    |j                  dt        j                  d            }|j                  dt        j                  d            }|j                  dt        j                  dd            }||j                  d      s|dz  }|| z  }|| t        j
                  ||d	}|||d
<   n'|%|j                  d      rt        ||||      }||d<   |	|	|d<   |
du rt        di |}|S t        di |}|S )Nr6   rW   r7   rV   r   r   rT   rZ   )r   r|   r   r   r   r   r   r   rP   r   Tr   )
rp   rf   rg   endswithrl   client_sessionrA   rx   r
   r   )r   r   r   r   r   r   r   r   rP   r   r   rt   r6   r7   r9   ry   s                   r!   ,_init_azure_client_for_cloudflare_ai_gatewayz9BaseAzureLLM._init_azure_client_for_cloudflare_ai_gateway^  s9    #&&{BII>O4PQ	"&&{BII>O4PQ	""IIm%ST
 >$$S)C5'"H  +'j&55*"3 "18#I.+!,,W5%A'5(1(1#	&N 9G#$45&2AX#$=>d")@,?@  %;':;r"   r   c                     |xs
 t               }|j                  xs< t        j                  xs* t        j                  xs t	        d      xs t	        d      }|r|| d<   | S t        |      }|rd| | d<   | S )NAZURE_OPENAI_API_KEYAZURE_API_KEYzapi-keyzBearer Authorization)r   r   rl   	azure_keyr   r   )r   r   r   rP   s       r!    _base_validate_azure_environmentz-BaseAzureLLM._base_validate_azure_environment  s     (A+?+A"" //  / 45/ o. 	 !(GIN ,N;)00@'AGO$r"   route)z/openai/responsesz/openai/vector_storesc                 v   | xs t         j                  xs t        d      } | t        d|  d      t	        j
                  |       }|xs i }t        t        t           |j                  d            }t        |j                        }d|vr|r||d<   || vrt        | |      }n| }t        j                  |      rNd|vrJt	        j
                  |      }t        |j                  |j                   j#                  dd      	            }t	        j
                  |      j                  |
      }t        |      S )NAZURE_API_BASEz^api_base is required for Azure AI Studio. Please set the api_base parameter. Passed `api_base=`r   r   )r   ending_pathz
/openai/v1z/openai)path)params)rl   r   r   rB   r&   URLr	   r   r   rp   r*   r   r   r   _is_azure_v1_api_version	copy_withr   replace)	r   r   r   original_urlr   query_paramsnew_url
parsed_url	final_urls	            r!   _get_base_azure_urlz BaseAzureLLM._get_base_azure_url  s7    Sw//S>BR3Spqypzz{|  yy* (-28C=.*<*<]*KL L//0 ,*5L'  +!uG G00=7*"YYw/
j22
8O8OPY[g8h2ij IIg&000E	9~r"   c                      | y| dk(  xs | dk(  S )NFpreviewlatestr   )r   s    r!   r   z%BaseAzureLLM._is_azure_v1_api_version  s     i'B;(+BBr"   )NNNFNN)r#   r$   r%   staticmethodr   r   r   r   r   r   r
   r*   boolr   r   intfloatr&   Timeoutr   r   r   r   r   r   r   r   r   r"   r!   r   r     s   	(2s7#	$ F &*AE)-#2#2 3-2 c]	2
 {,<<=>2 !2 2 }2 
%%556	72hx#x# #x# 3-	x#
 SMx# c]x# x# 
x#L BF44 4 	4
 4 uemm+,4 4 #4 !4 "*(2s7*;!<4 4 {,<<=>4 
{,,	-4l (01E(F	 0 )3-) ';T#s(^'K!LM) CD) 
	) )V Chsm C C Cr"   r   )rT   r   )+rh   rf   typingr   r   r   r   r   r   r	   r&   openair
   r   rl   litellm._loggingr   litellm.caching.cachingr   )litellm.llms.base_llm.chat.transformationr    litellm.llms.openai.common_utilsr   3litellm.secret_managers.get_azure_ad_token_providerr   litellm.secret_managers.mainr   litellm.types.routerr   litellm.utilsr   rj   r   r)   r*   r5   r   rH   rO   rx   r~   r   r   r   r"   r!   <module>r      sx    	 F F F  0  + - F : 8 5 /
' 
(65)<#= 6$ 66 @	555 5 	5
 b#g5x @	&&& & 	&
 b#g&Z  	['['c][' c][' C=	['
 	['|	4 	(c]DNC= NCr"   