Ë
    uPêjF‰  ã                   óô  — U d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZmZ d dlZd dlmZmZmZm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+ee,d<    G d„ ded¬«      Z- G d„ dede.¬«      Z/ G d„ dede.¬«      Z0 G d„ de «      Z1dejd                  e3z  de3fd„Z4 ed¬ «      d!e5d"e5d#e5d$e5deg e5f   f
d%„«       Z6	 d:d!e5d"e5d#e5d$e5deg e5f   f
d&„Z7	 d:d"e5d'e5d(e5d$e5deg e5f   f
d)„Z8	 	 	 d;d*e5d+e5dz  d,e5dz  d$e5dz  de5f
d-„Z9d.e3fd/„Z:d0e(de5dz  fd1„Z; G d2„ d3e"«      Z< G d4„ d5e«      Z=	 	 	 d;d6e5dz  d7e5dz  d8e5dz  de=fd9„Z>y)<é    N)ÚCallableÚMapping)Ú	lru_cache)ÚMappingProxyType)ÚAnyÚFinalÚLiteralÚ
NamedTupleÚcast)ÚAsyncAzureOpenAIÚAsyncOpenAIÚAzureOpenAIÚOpenAI)ÚReadOnlyÚ	TypedDict)Úverbose_logger)Ú	DualCache)ÚBaseLLMException)ÚBaseOpenAILLM)Úget_azure_ad_token_provider)Úget_secret_str)ÚGenericLiteLLMParams)Ú_add_path_to_api_baseÚazure_ad_cachec                   ó.   — e Zd ZU ee   ed<   ee   ed<   y)Ú_AzureAdTokenJsonÚaccess_tokenÚ
expires_inN)Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚ__annotations__Úint© ó    úd/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/azure/common_utils.pyr   r      s   … Ø˜3‘-ÓØ˜‘Ôr&   r   F)Útotalc                   ó   — e Zd ZU ee   ed<   y)Ú_AzureV1ClientParamsÚbase_urlN)r   r    r!   r   r"   r#   r%   r&   r'   r*   r*   "   s   … Ø�s‰mÔr&   r*   )r(   Úextra_itemsc                   óh   — e Zd ZU ee   ed<   ee   ed<   ee   ed<   eeej                  z     ed<   y)Ú_AzureGatewayClientParamsÚapi_versionr+   Úmax_retriesÚtimeoutN)
r   r    r!   r   r"   r#   r$   ÚfloatÚhttpxÚTimeoutr%   r&   r'   r.   r.   &   s4   … Ø˜#‘ÓØ�s‰mÓØ˜#‘ÓØ�e˜eŸm™mÑ+Ñ,Ô,r&   r.   c            
       ó”   ‡ — e Zd Z	 	 	 	 ddej                  dz  dej
                  dz  dej                  ez  dz  dedz  fˆ fd„Zˆ xZ	S )ÚAzureOpenAIErrorNÚrequestÚresponseÚheadersÚbodyc                 ó0   •— t         ‰| �  ||||||¬«       y )N)Ústatus_codeÚmessager7   r8   r9   r:   )ÚsuperÚ__init__)Úselfr<   r=   r7   r8   r9   r:   Ú	__class__s          €r'   r?   zAzureOpenAIError.__init__.   s)   ø€ ô 	‰ÑØ#ØØØØØð 	õ 	
r&   )NNNN)
r   r    r!   r3   ÚRequestÚResponseÚHeadersÚdictr?   Ú__classcell__)rA   s   @r'   r6   r6   -   sg   ø„ ð
 )-Ø*.Ø/3Ø ñ
ð —‘ Ñ%ð	
ð
 —.‘. 4Ñ'ð
ð —‘ Ñ%¨Ñ,ð
ð �T‰k÷
ñ 
r&   r6   r9   Ú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)r9   Úopenai_headersÚkÚvÚllm_response_headerss        r'   Úprocess_azure_headersrP   A   s³   € Ø€NØ# wÑ.Ø7>Ð?[Ñ7\ˆÐ3Ñ4Ø'¨7Ñ2Ø;BÐCcÑ;dˆÐ7Ñ8Ø! WÑ,Ø5<Ð=WÑ5XˆÐ1Ñ2Ø%¨Ñ0Ø9@ÐA_Ñ9`ˆÐ5Ñ6ØT[×TaÑTaÓTc×"dÉDÈAÈq 7§>¡>°.À!Ó#DÀaÑ#GÐ"dÐÑ"dà5Ð"Ð5 nÐ5Ð5ùó #es   ÁA,é€   )ÚmaxsizeÚ	tenant_idÚ	client_idÚclient_secretÚscopec                 ó4   — ddl m}m}  | || ||«      |«      S )a8  Build (once per credential set) a bearer token provider backed by a `ClientSecretCredential`.

    The credential caches the access token internally and only talks to Entra ID when it is close
    to expiry, so reusing the provider keeps one AAD round trip per token lifetime instead of one
    per request.
    r   )ÚClientSecretCredentialÚget_bearer_token_provider)Úazure.identityrX   rY   )rS   rT   rU   rV   rX   rY   s         r'   Ú_cached_entra_id_token_providerr[   P   s!   € ÷ Qá$Ñ%;¸IÀyÐR_Ó%`ÐbgÓhÐhr&   c                 óŠ  — t        j                  d«       | j                  d«      rt        | «      }n| }|j                  d«      rt        |«      }n|}|j                  d«      rt        |«      }n|}t        j                  d|||du«       |�|�|€t	        d«      ‚t        ||||¬«      }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.
    z$Getting Azure AD Token from Entra IDzos.environ/z2tenant_id=%s, client_id=%s, client_secret=[set=%s]Nz8tenant_id, client_id, and client_secret must be provided©rS   rT   rU   rV   útoken_provider %s)r   ÚdebugÚ
startswithr   Ú
ValueErrorr[   )rS   rT   rU   rV   Ú
_tenant_idÚ
_client_idÚ_client_secretÚtoken_providers           r'   Ú get_azure_ad_token_from_entra_idrf   b   sÖ   € ô$ ×ÑÐ?Ô@à×Ñ˜MÔ*Ü# IÓ.‰
àˆ
à×Ñ˜MÔ*Ü# IÓ.‰
àˆ
à×Ñ Ô.Ü'¨Ó6‰à&ˆä×ÑØ<ØØØ˜dÐ"ô	ð Ð˜ZÐ/°>Ð3IÜÐSÓTÐTä;ØØØ$Øô	€Nô ×ÑÐ,¨nÔ=àÐr&   Úazure_usernameÚazure_passwordc                 ó¢   — ddl m}m} t        j                  d| |du|du«        || ||¬«      } |||«      }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   )ÚUsernamePasswordCredentialrY   z>client_id=%s, azure_username=[set=%s], azure_password=[set=%s]N)rT   ÚusernameÚpasswordr^   )rZ   rj   rY   r   r_   )rT   rg   rh   rV   rj   rY   Ú
credentialre   s           r'   Ú)get_azure_ad_token_from_username_passwordrn   š   sf   € ÷$ Uä×ÑØHØØ˜dÐ"Ø˜dÐ"ô	ñ 3ØØØô€Jñ 6°jÀ%ÓH€Nä×ÑÐ,¨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.)rp   rq   Úazure_authority_hostÚ
oidc_tokenú/z/oauth2/v2.0/tokenÚclient_credentialsz6urn:ietf:params:oauth:client-assertion-type:jwt-bearer)rT   Ú
grant_typerV   Úclient_assertion_typeÚclient_assertion)ÚdataéÈ   r   r   z(Azure AD Token access_token not returnedz&Azure AD Token expires_in not returned)ÚkeyÚvalueÚttl)ÚosÚgetenvr6   r   ÚjsonÚdumpsr   Ú	get_cacheÚlitellmÚmodule_level_clientÚpostr<   ÚtextÚgetÚ	set_cache)ro   rp   rq   rV   rw   rx   Ú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_oidcr”   Á   sÁ  € ð$ €}Ø>ˆÜ"$§)¡)Ð,BÐDgÓ"hÐØ%ÒE¬¯©Ð3DÓ)E€OØ%ÒE¬¯©Ð3DÓ)E€OØÐ /Ð"9ÜØØEô
ð 	
ô
 ' ~Ó6€JàÐÜØØLô
ð 	
ô
 '+§j¡jà.Ø.Ø$8Ø$ñ		
ó'Ðô #1×":Ñ":Ð;SÓ"TÐØ"Ð.Ø*Ð*ä×/Ñ/€Fà—{‘{ØÐ
   /Ð!2Ð2DÐEà(Ø.ØØ%]Ø *ñ
ð #ó 	€Ið ×Ñ Ò#ÜØ!×-Ñ-Ø—N‘Nô
ð 	
ð
 5>·N±NÓ4DÐØ"5×"9Ñ"9¸.È$Ó"OÐØ':×'>Ñ'>¸|ÈTÓ'RÐà"Ð*Ü¨3Ð8bÔcÐcà Ð(Ü¨3Ð8`ÔaÐaä×ÑØ$Ø)Ø%ð ô ð 'Ð&r&   Úazure_client_paramsc                 ób   — | j                  dd «      }|�d|v r|| d<   | j                  d«       | S )NÚazure_endpointz/openai/deploymentsr+   )rŒ   Úpop)r•   r—   s     r'   Ú!select_azure_base_url_or_endpointr™     sC   € Ø/×3Ñ3Ð4DÀdÓK€NØÐ!à  NÑ2à.<Ð 
Ñ+Ø×#Ñ#Ð$4Ô5àÐr&   Úlitellm_paramsc                 óä  — | j                  d«      }| j                  d«      xs t        d«      }| j                  d«      xs t        j                  d«      }| j                  d«      xs t        j                  d«      }| j                  d«      xs t        j                  d	«      }| j                  d
«      xs t        j                  d«      }| j                  d«      xs t        j                  d«      }| j                  d«      xs 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%        |«      rS	  |«       }
t'        |
t(        «      s6t	        j                  dt+        |
«      «       t-        d t+        |
«      › �«      ‚|
}	 |S |S # t        $ r t	        j
                  d«       Y Œœt        $ r}	t	        j                  d|	«       |	‚d}	~	ww xY w# t,        $ r ‚ t        $ r*}	t	        j                  d!|	«       t/        d"|	› �«      |	‚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_providerro   ÚAZURE_AD_TOKENrS   rv   rT   ru   rU   ÚAZURE_CLIENT_SECRETrg   ÚAZURE_USERNAMErh   ÚAZURE_PASSWORDÚazure_scopeÚAZURE_SCOPErs   Nú:Using Azure AD Token Provider from Entra ID for Azure Authr]   ú0Using Azure Username and Password for Azure Auth©rg   rh   rT   rV   úoidc/ú%Using Azure OIDC Token for Azure Auth©ro   rp   rq   rV   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.z–Error calling Azure AD token provider: %s. Follow docs - https://docs.litellm.ai/docs/providers/azure/#azure-ad-token-refresh---defaultazurecredential)rV   z5Azure AD token provider returned non-string value: %sz%Azure AD token must be a string, got z)Error calling Azure AD token provider: %szFailed to get Azure AD token: )rŒ   r   rƒ   r„   r   r_   rf   rn   r`   r”   rˆ   Úenable_azure_ad_token_refreshr   ra   Ú	ExceptionÚerrorÚBaseAzureLLMÚ*_try_get_default_azure_credential_providerÚcallableÚ
isinstancer"   ÚtypeÚ	TypeErrorÚRuntimeError)rš   rœ   ro   rS   rT   rU   rg   rh   rV   ÚeÚtokens              r'   Úget_azure_ad_tokenr·   %  sú  € ð: -×0Ñ0Ð1JÓKÐØ#×'Ñ'Ð(8Ó9Ò]¼^ÐL\Ó=]€NØ%×)Ñ)¨+Ó6ÒV¼"¿)¹)ÐDUÓ:V€IØ%×)Ñ)¨+Ó6ÒV¼"¿)¹)ÐDUÓ:V€IØ)×-Ñ-¨oÓ>ÒbÄ"Ç)Á)ÐLaÓBb€MØ*×.Ñ.Ð/?Ó@Ò_ÄBÇIÁIÐN^ÓD_€NØ*×.Ñ.Ð/?Ó@Ò_ÄBÇIÁIÐN^ÓD_€NØ×Ñ˜}Ó-ò ´·±ØÐEó2€Eð €}Ø>ˆð Ð&©9¹Á}Ü×ÑÐYÔZÜ"BØØØ'Øô	#
Ðð Ð&©>¹nÑQZÜ×ÑÐOÔPÜ"KØ)Ø)ØØô	#
Ðñ ‘Y¡>°n×6OÑ6OÐPWÔ6XÜ×ÑÐDÔEÜ5Ø)Ø%Ø%Øô	
‰ð 
!Ð	(¬W×-RÑ-RÐVZÑ-ZÜ×Ñð Eô	
ð		Ü&AÈeÔ&TÐ#ð #Ð*¨~Ð/EÜ&2×&]Ñ&]Øð '^ó 'Ð#ñ
 ¤8Ð,CÔ#Dð	LÙ2Ó4ˆEÜ˜e¤SÔ)Ü×$Ñ$Ð%\Ô^bÐchÓ^iÔjÜÐ"GÌÈUËÀ}Ð UÓVÐVà!&‘ð Ðˆ>ÐøôE ò 	OÜ× Ñ Ð!MÖNÜò 	Ü× Ñ ð iØôð ˆGûð	ûô2 ò 	àÜò 	LÜ× Ñ Ð!LÈaÔPÜÐ!?À¸sÐCÓDÈ!ÐKûð	Lús7   Ç#I+ ÈAJ3 É+J0ÊJ0ÊJ+Ê+J0Ê3K/Ë%K*Ë*K/c                   ó|  — e Zd Zededeg ef   dz  fd„«       Z	 	 	 	 	 d"dedz  dedz  dedz  deez  e	z  e
z  dz  d	edz  d
ededz  deez  e	z  e
z  dz  fd„Zd	ededz  dedz  dedz  dedz  dedefd„Z	 d#dededededeej$                  z  d	ededz  dedz  deg ef   dz  dedeez  dz  deez  fd„Zeded	edz  defd„«       Ze	 d#dedz  d	eeeef   z  dz  ded   ez  deed   z  dz  def
d„«       Zedededz  dededz  fd„«       Zededz  defd„«       Zd	eeedz  f   ded ededz  fd!„Zy)$r®   rV   rG   Nc                 óî   — ddl m} t        j                  d«       	 t	        | |j
                  ¬«      }t        j                  d«       |S # t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)zñ
        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: %sN)Ú9litellm.types.secret_managers.get_azure_ad_token_providerrº   r   r_   r   ÚDefaultAzureCredentialr¬   )rV   rº   rœ   rµ   s       r'   r¯   z7BaseAzureLLM._try_get_default_azure_credential_provider™  so   € õ	
ô 	×ÑÐVÔWð		Ü-HØ!Ø!4×!KÑ!Kô.Ð#ô × Ñ Ð!mÔnØ*Ð*øÜò 	Ü× Ñ Ð!DÀaÔHÜûð	ús   �-A Á	A4ÁA/Á/A4Úapi_keyÚapi_baser/   r�   rš   Ú	_is_asyncÚmodelc                 óÄ  ‡— d }t        «       }	||	d<   |xs i }
|
j                  d«      }|
j                  d«      }|
j                  d«      }|
j                  d«      }t        |t        «      r1t	        j
                  |j                  «       «      j                  «       nd |	d<   dt        |«      rt        |«      nd › d|
j                  d«      › d	|
j                  d
«      › dt        |t        «      r1t	        j
                  |j                  «       «      j                  «       nd › d|
j                  d«      › dt        |t        «      r1t	        j
                  |j                  «       «      j                  «       nd › d|
j                  d«      › �|	d<   |�e|�Lt        |t        t        f«      r6t        |j                  t        «      r|j                  j                  d|«       | j                  ||	dd¬«       |S | j!                  |	d¬«      }|r"t        |t        t        t"        t$        f«      r|S | j'                  |xs i |||||¬«      }| j)                  |«      r·|j                  d«      xs$ |j                  d«      xs |j                  d«      }|du rt        |«      r|Šdt        fˆfd„}|}||› d�dœ}d|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   t+        j,                  d |d!   «       |du rt%        d"i |¤Ž}n't#        d"i |¤Ž}n|du rt        d"i |¤Ž}nt        d"i |¤Ž}| j                  ||	d| j/                  |j                  d«      «      ¬«       |S )#NÚis_asyncrœ   ro   rU   rh   zprovider_id=z|tenant_id=rS   z|client_id=rT   z|client_secret=z|azure_username=rg   z|azure_password=z|azure_scope=r¡   úapi-versionÚazureF)Úopenai_clientÚclient_initialization_paramsÚclient_typeÚlitellm_owned_client)rÇ   rÈ   )rš   r¾   r¿   Ú
model_namer/   rÃ   r¾   TrG   c               “   óJ   •K  — t        j                  ‰ «      ƒ d {  –—† S 7 Œ­w©N)ÚasyncioÚ	to_thread)Ú_sync_providers   €r'   Ú_async_v1_api_keyz?BaseAzureLLM.get_azure_openai_client.<locals>._async_v1_api_key  s   øè ø€ Ü!(×!2Ñ!2°>Ó!B×BÐBÐBús   ƒ#œ!�#z/openai/v1/)r¾   r+   r1   r0   Úhttp_clientz$Using Azure v1 API with base_url: %sr+   r%   )ÚlocalsrŒ   r±   r"   ÚhashlibÚsha256ÚencodeÚ	hexdigestr°   Úidr   r   Ú_custom_queryrE   Ú
setdefaultÚset_cached_openai_clientÚget_cached_openai_clientr   r   Úinitialize_azure_sdk_clientÚ_is_azure_v1_api_versionr   r_   Úowns_wrapped_http_client)r@   r¾   r¿   r/   r�   rš   rÀ   rÁ   rÆ   rÇ   Ú_lpÚ_ad_providerÚ	_ad_tokenrd   Ú_azure_passwordÚcached_clientr•   Ú
v1_api_keyrÐ   Ú	v1_paramsrÏ   s                       @r'   Úget_azure_openai_clientz$BaseAzureLLM.get_azure_openai_client·  sÁ  ø€ ð W[ˆÜ4:³HÐ$Ø3<Ð$ ZÑ0Ø#Ò) rˆØ!Ÿg™gÐ&?Ó@ˆØŸ7™7Ð#3Ó4ˆ	Ø #§¡¨Ó 8ˆØ!$§¡Ð)9Ó!:ˆä>HÈÔTWÔ>XŒG�N‰N˜9×+Ñ+Ó-Ó.×8Ñ8Ô:Ð^bð 	%Ð%5Ñ6ð ¬x¸Ô/Eœ2˜lÔ+È4ÐPØ˜#Ÿ'™' +Ó.Ð/Ø˜#Ÿ'™' +Ó.Ð/ØÔU_Ð`nÔpsÔUtœgŸn™n¨^×-BÑ-BÓ-DÓE×OÑOÔQÐz~ÐØ˜sŸw™wÐ'7Ó8Ð9ØÔWaÐbqÔsvÔWwœwŸ~™~¨o×.DÑ.DÓ.FÓG×QÑQÔSð  ~Bð  CØ˜CŸG™G MÓ2Ð3ð5ð 	%Ð%>Ñ?ð ÐàÐ'Ü˜v¬Ô5EÐ'FÔGÜ˜v×3Ñ3´TÔ:ð ×$Ñ$×/Ñ/°¸{ÔKØ×)Ñ)Ø$Ø-IØ#Ø%*ð	 *ô ð ˆMà#×<Ñ<Ø)EØð  =ó  
ˆñ Ü˜-¬+Ô7GÌÔQ\Ð)]Ô^Ø$Ð$à%)×%EÑ%EØ)Ò/¨RØØØØ#Øð &Fó &
Ðð ×(Ñ(¨Ô5ð $×'Ñ'¨	Ó2ò =Ø&×*Ñ*Ð+DÓEò=à&×*Ñ*Ð+;Ó<ð ð
 ˜DÑ ¤X¨jÔ%9ð
 )3�ðC´õ Cð /�
ð &Ø'˜j¨Ð4ñ6ˆIð Ð/Ñ/Ø':¸9Ñ'E�	˜)Ñ$ØÐ 3Ñ3Ø+>¸}Ñ+M�	˜-Ñ(ØÐ 3Ñ3Ø+>¸}Ñ+M�	˜-Ñ(ä× Ñ Ð!GÈÐS]ÑI^Ô_à˜DÑ Ü +Ñ 8¨iÑ 8‘ä &Ñ 3¨Ñ 3‘ð ˜DÑ Ü 0Ñ GÐ3FÑ G‘ä +Ñ BÐ.AÑ B�ð 	×%Ñ%Ø'Ø)EØØ!%×!>Ñ!>Ð?R×?VÑ?VÐWdÓ?eÓ!fð	 	&ô 	
ð Ðr&   rÊ   rÃ   c                 ó²  — |j                  d«      }|j                  d«      }| j                  |dd«      }	| j                  |dd«      }
| j                  |dd«      }| j                  |d	d
«      }| j                  |dd«      }| 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!œ}|du r| j#                  «       |d"<   n| j%                  «       |d"<   |�||d<   |�||d<   |�||d<   t'        |¬#«      }|S # t        $ r t        j                  d«       Y ŒÐw xY w)$Nrœ   ro   rS   rv   rT   ru   rU   rž   rg   rŸ   rh   r    r¡   r¢   rs   r0   r1   r£   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***************zAInitializing Azure OpenAI Client for %s, Api Base: %s, Api Key:%s)r¾   r—   r/   ro   rœ   rÑ   )r•   )rŒ   Ú_resolve_env_varr   r_   rf   rn   r`   r”   rˆ   r«   r   ra   rƒ   r„   ÚAZURE_DEFAULT_API_VERSIONr±   r"   Ú_get_async_http_clientÚ_get_sync_http_clientr™   )r@   rš   r¾   r¿   rÊ   r/   rÃ   rœ   ro   rS   rT   rU   rg   rh   rV   r0   r1   Ú_api_keyr•   s                      r'   rÜ   z(BaseAzureLLM.initialize_azure_sdk_client1  sÉ  € ð #1×"4Ñ"4Ð5NÓ"OÐà'×+Ñ+Ð,<Ó=ˆð  ×0Ñ0°ÀÐN_Ó`ˆ	Ø×0Ñ0°ÀÐN_Ó`ˆ	Ø#×4Ñ4°^À_ÐVkÓlˆØ $× 5Ñ 5°nÐFVÐXhÓ iˆØ $× 5Ñ 5°nÐFVÐXhÓ iˆØ×%Ñ% n°mÀ]ÓSˆØˆ=ØBˆEà+×/Ñ/°Ó>ˆØ'×+Ñ+¨IÓ6ˆÙÐ2Ð:¹yÉYÑ[hÜ× Ñ Ð!]Ô^Ü&FØ#Ø#Ø+Øô	'Ð#ð #Ð*©~Á.ÑU^Ü× Ñ Ð!SÔTÜ&OØ-Ø-Ø#Øô	'Ð#ð Ð%¨.×*CÑ*CÀGÔ*LÜ× Ñ Ð!HÔIÜ9Ø-Ø )Ø )Øô	‰Nñ Ð4Ð<Ä×AfÑAfÐjnÑAnÜ× Ñ ØnôðSÜ*EØ %ô+Ð'ð
 ÐÜŸ)™)Ð$7¼×9ZÑ9ZÓ[ˆKàˆØÐ¤J¨x¼Ô$=à  �| hÑ.ˆHÜ×ÑØOÐQ[Ð]eÐgoô	
ð Ø&Ø&Ø,Ø'>ñ
Ðð �tÑØ15×1LÑ1LÓ1NÐ Ò.à15×1KÑ1KÓ1MÐ Ñ.àÐ"Ø1<Ð Ñ.ØÐØ-4Ð 	Ñ*à"Ð.Ø=TÐÐ 9Ñ:ô @ÐTgÔhÐà"Ð"øôK ò SÜ×$Ñ$Ð%QÖRðSús   Å9H5 È5IÉIr0   r1   ro   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 )NrS   rv   rT   ru   r¡   r¢   rs   ry   )r/   r+   rÑ   r0   r1   r¾   r¦   r¨   ro   rœ   Tr%   )
rŒ   rƒ   r„   Úendswithrˆ   Úclient_sessionr`   r”   r   r   )r@   r¿   rÁ   r/   r0   r1   rš   r¾   ro   rœ   rï   r�   rS   rT   rV   r•   s                   r'   Ú,_init_azure_client_for_cloudflare_ai_gatewayz9BaseAzureLLM._init_azure_client_for_cloudflare_ai_gateway“  s:  € ð *×-Ñ-¨k¼2¿9¹9ÐEVÓ;WÓXˆ	Ø)×-Ñ-¨k¼2¿9¹9ÐEVÓ;WÓXˆ	Ø%×)Ñ)ØÜ�I‰I�mÐ%SÓTó
ˆð ˆ>Ø×$Ñ$ SÔ)Ø˜C‘�Ø˜5˜'Ñ"ˆHð  +Ø'˜jÜ&×5Ñ5Ø*Ø"ñEÐð Ð"Ø18Ð# IÒ.ØÐ+Ø!×,Ñ,¨WÔ5Ü%AØ'5Ø(1Ø(1Ø#ô	&�Nð 9GÐ#Ð$4Ñ5Ø&Ð2ØAXÐ#Ð$=Ñ>à˜dÑ"Ü)Ñ@Ð,?Ñ@�ð ˆô %Ñ;Ð':Ñ;�Øˆr&   r9   c                 óþ   — |xs
 t        «       }d| v r| S |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 )Nzapi-keyÚAZURE_OPENAI_API_KEYÚAZURE_API_KEYzBearer ÚAuthorization)r   r¾   rˆ   Ú	azure_keyr   r·   )r9   rš   r¾   ro   s       r'   Ú _base_validate_azure_environmentz-BaseAzureLLM._base_validate_azure_environmentÉ  s¢   € à'ÒAÔ+?Ó+Aˆð ˜ÑØˆNð ×"Ñ"ò /Ü�‰ò/ä× Ñ ò/ô Ð4Ó5ò/ô ˜oÓ.ð 	ñ Ø!(ˆG�IÑØˆNô !3°>Ó BˆÙØ)0°Ð0@Ð'AˆG�OÑ$àˆr&   Úroute)z/openai/responsesz/openai/vector_storesÚdefault_api_version)ÚlatestÚpreviewc                 óv  — | xs t         j                  xs t        d«      } | €t        d| › d�«      ‚t	        j
                  | «      }|xs i }t        t        dz  |j                  d«      «      xs |}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 )a}  
        Get the base Azure URL for the given route and API version.

        Args:
            api_base: The base URL of the Azure API.
            litellm_params: The litellm parameters.
            route: The route to the API.
            default_api_version: The default API version to use if no api_version is provided. If 'latest', it will use `openai/v1/...` route.
        ÚAZURE_API_BASENz^api_base is required for Azure AI Studio. Please set the api_base parameter. Passed `api_base=ú`r/   rÄ   )r¿   Úending_pathz
/openai/v1ú/openai)Úpath)Úparams)rˆ   r¿   r   ra   r3   ÚURLr   r"   rŒ   rE   r  r   r®   rÝ   Ú	copy_withr  Úreplace)
r¿   rš   rú   rû   Úoriginal_urlr/   Úquery_paramsÚnew_urlÚ
parsed_urlÚ	final_urls
             r'   Ú_get_base_azure_urlz BaseAzureLLM._get_base_azure_urlå  s8  € ð" ÒSœw×/Ñ/ÒS´>ÐBRÓ3SˆØÐÜØpÐqyÐpzÐz{Ð|óð ô $Ÿi™i¨Ó1ˆð (Ò-¨2ˆÜ!¤#¨¡*¨n×.@Ñ.@ÀÓ.OÓPÒgÐTgˆô # <×#6Ñ#6Ó7ˆð  Ñ,±Ø*5ˆL˜Ñ'ð ˜Ñ Ü+°XÈ5ÔQ‰GàˆGä×0Ñ0°Ô=à 7Ñ*Ü$)§I¡I¨gÓ$6�
Ü˜j×2Ñ2¸
¿¹×8OÑ8OÐPYÐ[gÓ8hÐ2ÓiÓj�ô !Ÿ9™9 WÓ-×7Ñ7¸|Ð7ÓLˆ	ä�9‹~Ðr&   c                 ó¾  — t         j                  |«      syt        j                  | «      }|j                  j                  d«      }t        |j                  |dk(  r|j                  n|j                  d| t        j                  t        d„ |j                  j                  «       D «       «      «      ¬«      «      }t         j                  |t        d|i«      |¬«      S )aS  
        Azure's v1 surface serves images at ``/openai/v1/images/{generations,edits}`` and routes by
        ``model`` in the request body, so any deployment path and stale ``api-version`` in
        ``api_base`` have to be dropped.

        Returns None when ``api_version`` is a dated one, which still uses the deployment route.
        Nr  éÿÿÿÿc              3   ó6   K  — | ]  \  }}|d k7  sŒ||f–— Œ y­w)rÄ   Nr%   )Ú.0rM   rN   s      r'   ú	<genexpr>z6BaseAzureLLM.get_azure_v1_image_url.<locals>.<genexpr>*  s!   è ø€ Ò.v¹$¸!¸QÐcdÐhuÓcu°°1¬vÑ.vùs   ‚�	)r  r  r/   )r¿   rš   rú   )r®   rÝ   r3   r  r  Úfindr"   r  ÚQueryParamsÚtupler  Úmulti_itemsr  r   )r¿   r/   rú   r+   Úopenai_path_startÚresource_bases         r'   Úget_azure_v1_image_urlz#BaseAzureLLM.get_azure_v1_image_url  sÅ   € ô ×4Ñ4°[ÔAØäŸ)™) HÓ-ˆØ#+§=¡=×#5Ñ#5°iÓ#@ÐÜ"Ø×ÑØ&7¸2Ò&=�X—]’]À8Ç=Á=ÐQcÐRcÐCdÜ×(Ñ(¬Ñ.vÀ(Ç/Á/×B]ÑB]ÓB_Ô.vÓ)vÓwð ó ó 
ˆô ×/Ñ/Ø"Ü+¨]¸KÐ,HÓIØð 0ó 
ð 	
r&   c                 ó   — | €y| dv S )NF>   Úv1rü   rý   r%   )r/   s    r'   rÝ   z%BaseAzureLLM._is_azure_v1_api_version3  s   € àÐØØÐ9Ð9Ð9r&   Ú	param_keyÚenv_var_keyc                 óV   — |j                  |«      }|�|S t        j                  |«      S )a!  Resolve the environment variable for a given parameter key.

        The logic here is different from `params.get(key, os.getenv(env_var))` because
        litellm_params may contain the key with a None value, in which case we want
        to fallback to the environment variable.
        )rŒ   rƒ   r„   )r@   rš   r  r  Úparam_values        r'   rê   zBaseAzureLLM._resolve_env_var9  s/   € ð ,×/Ñ/°	Ó:ˆØÐ"ØÐÜ�y‰y˜Ó%Ð%r&   )NNNFNrÌ   )r   r    r!   Ústaticmethodr"   r   r¯   r   r   r   r   rE   Úboolræ   rÜ   r$   r2   r3   r4   ró   r   rù   r   Úobjectr	   r  r  rÝ   rê   r%   r&   r'   r®   r®   ˜  s6  „ ØðØðà	�"�c�'Ñ	˜TÑ	!òó ððB #'ØOSØ&*ØØ ñxà�t‘ðxð ˜‘*ðxð ˜4‘Zð	xð
 Ð.Ñ.°Ñ7¸+ÑEÈÑLðxð ˜t™ðxð ðxð �T‰zðxð 
Ð'Ñ	'¨&Ñ	0°;Ñ	>ÀÑ	Eóxðt`#àð`#ð �t‘ð`#ð ˜‘*ð	`#ð
 ˜$‘Jð`#ð ˜4‘Zð`#ð ð`#ð 
ó`#ð\ 9=ñ4àð4ð ð4ð ð	4ð
 ð4ð ˜Ÿ™Ñ&ð4ð ð4ð �t‘ð4ð ˜d™
ð4ð "*¨"¨c¨'Ñ!2°TÑ!9ð4ð ð4ð Ð.Ñ.°Ñ5ð4ð 
Ð'Ñ	'ó4ðl ð°$ð ÐH\Ð_cÑHcð Ðhlò ó ðð6 ð
 JNñ	1Ø˜‘*ð1à,¨w°s¸F°{Ñ/CÑCÀdÑJð1ð ÐCÑDÀsÑJð1ð ! 7Ð+>Ñ#?Ñ?À$ÑFð	1ð
 
ò1ó ð1ðf ð
¨ð 
¸3À¹:ð 
Ècð 
ÐVYÐ\`ÑV`ò 
ó ð
ð2 ð:¨c°D©jð :¸Tò :ó ð:ð
&Ø% c¨3°©: oÑ6ð&ØCFð&ØUXð&à	ˆt‰ô&r&   r®   c                   ó>   — e Zd ZU edz  ed<   edz  ed<   edz  ed<   y)ÚAzureCredentialsNr¿   r¾   r/   )r   r    r!   r"   r#   r%   r&   r'   r$  r$  H  s    … Ø�D‰jÓØ�4‰ZÓØ�t‘Ôr&   r$  r¿   r¾   r/   c                 ó"  — | xs t         j                  xs t        d«      }|xs t         j                  xs t        d«      }|xs< t         j                  xs* t         j
                  xs t        d«      xs t        d«      }t        |||¬«      S )zEResolve Azure credentials from params, litellm globals, and env vars.rÿ   rè   rõ   rö   )r¿   r¾   r/   )rˆ   r¿   r   r/   r¾   rø   r$  )r¿   r¾   r/   Úresolved_api_baseÚresolved_api_versionÚresolved_api_keys         r'   Úget_azure_credentialsr)  N  s•   € ð  (Ò_¬7×+;Ñ+;Ò_¼~ÐN^Ó?_ÐØ"-Ò"k´×1DÑ1DÒ"kÌÐWjÓHkÐàò 	+Ü�?‰?ò	+ä×Ñò	+ô Ð0Ó1ò	+ô ˜/Ó*ð ô Ø"Ø Ø(ôð r&   )rs   )NNN)?rÍ   rÓ   r…   rƒ   Úcollections.abcr   r   Ú	functoolsr   Útypesr   Útypingr   r   r	   r
   r   r3   Úopenair   r   r   r   Útyping_extensionsr   r   rˆ   Ú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   r   r#   r   r"  r*   r.   r6   rD   rE   rP   r"   r[   rf   rn   r”   r™   r·   r®   r$  r)  r%   r&   r'   ú<module>r8     s`  ðÜ Û Û Û 	ß -Ý Ý "ß 8Õ 8ã ß EÓ Eß 1ã Ý +Ý -Ý FÝ :õõ 8Ý 5Ý /á!›€�Ó #ô˜	¨õ ô
˜9¨E¸võ ô- 	°ÀFõ -ô
Ð'ô 
ð(6 5§=¡=°4Ñ#7ð 6¸Dó 6ñ �3ÔðiØðiàðið ðið ð	ið
 ˆb�#ˆgÑòió ðið* @ñ	5Øð5àð5ð ð5ð ð	5ð
 ˆb�#ˆgÑó5ðx @ñ	$Øð$àð$ð ð$ð ð	$ð
 ˆb�#ˆgÑó$ðR #'Ø"&Øñ	U'ØðU'à˜4‘ZðU'ð ˜4‘ZðU'ð �‰:ð	U'ð
 	óU'ðp	¸4ó 	ðpØ(ðpàˆ4�Zópôfm&�=ô m&ô`�zô ð  ØØ"ñØ�D‰jðà�4‰Zðð �t‘ðð ô	r&   