o
    ưi                     @   sV  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mZmZmZmZm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 d dlm Z m!Z!m"Z"m#Z# d d	l$m%Z%m&Z&m'Z' d
dl(m)Z) ddl*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 G dd dZ4de5de	e
eef  de6fddZ7G dd de.e+Z8dS )    N)AnyCallable	CoroutineDictListOptionalUnion)APITimeoutErrorAsyncAzureOpenAIAsyncOpenAIAzureOpenAIOpenAI)AZURE_OPERATION_POLLING_TIMEOUTDEFAULT_MAX_RETRIES)Logging)track_llm_api_timing)AsyncHTTPHandlerHTTPHandlerget_async_httpx_client)EmbeddingResponseImageResponseLlmProvidersModelResponse)CustomStreamWrapper convert_to_model_response_object
modify_url   )HttpxBinaryResponseContent   )BaseLLM   )AzureOpenAIErrorBaseAzureLLMget_azure_ad_token_from_oidcprocess_azure_headers!select_azure_base_url_or_endpoint)!get_azure_image_generation_configc                   @   s8   e Zd ZdZ		dddZdd Zded	efd
dZdS )AzureOpenAIAssistantsAPIConfigz
    Reference: https://learn.microsoft.com/en-us/azure/ai-services/openai/assistants-reference-messages?tabs=python#create-message
    returnNc                 C   s   d S N selfr*   r*   O/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/azure/azure.py__init__5   s   z'AzureOpenAIAssistantsAPIConfig.__init__c                 C   s   g dS )N)rolecontentattachmentsmetadatar*   r+   r*   r*   r-   *get_supported_openai_create_message_params:   s   zIAzureOpenAIAssistantsAPIConfig.get_supported_openai_create_message_paramsnon_default_paramsoptional_paramsc                 C   s   |  D ]f\}}|dkr||d< |dkr||d< q|dkr/t|tr'||d< qtjjddd|dkrjg }t|tr\|D ]}d|v rJ||d  q<tjd	u rPq<tjjd
	|ddqtjjd	t
||ddq|S )Nr/   r2   r0   z'Azure only accepts content as a string.  )messagestatus_coder1   Zfile_idTzTAzure doesn't support {}. To drop it from the call, set `litellm.drop_params = True.zWInvalid param. attachments should always be a list. Got={}, Expected=List. Raw value={})items
isinstancestrlitellmutilsZUnsupportedParamsErrorlistappendZdrop_paramsformattype)r,   r4   r5   paramvalueZfile_idsitemr*   r*   r-   'map_openai_params_create_message_paramsB   sF   




zFAzureOpenAIAssistantsAPIConfig.map_openai_params_create_message_paramsr(   N)__name__
__module____qualname____doc__r.   r3   dictrE   r*   r*   r*   r-   r'   0   s    
r'   azure_client_paramsazure_clientr(   c                 C   sT   |du rdS dg}|   D ]\}}||v r'|dkr'|dur'||jd kr' dS qdS )z
    Returns True if user passed in client params != initialized azure client

    Currently only implemented for api version
    NTapi_versionzapi-versionF)r9   Z_custom_query)rL   rM   dynamic_paramskvr*   r*   r-   _check_dynamic_azure_paramsn   s   	rR   c                $       sb  e Zd ZdC fddZdeeef dedeee	j
f fdd	Ze deeef dedeee	j
f d
efddZ			dDdedededee dedededee dee dededeee	j
f d
ededee fddZddddi fdee dededededededed
ededee dee dee dee fd d!Zdddi fdedee dededededededee dee dee fd"d#Zdddi fd
ededee dededededededee dee dee fd$d%Zdddddddi fdededed&ed
ededee dee d'ee deeee	j
f  dee dee dee dee defd(d)Z								dEded&edededed
eded*edee dee dee dee dee dee deeeeeef f fd+d,Z d'ee! deeee	j
f  dededededede	j"fd-d.Z#d'ee$ deeee	j
f  dededededede	j"fd/d0Z%d1edee defd2d3Z&			dFdedee' d1eded&ed
ededee de'fd4d5Z(										dGd6eded*ed
ededee dee dee dee dee' dee dee dee de'fd7d8Z)					dHded&ed9ed*edee dee dee d:ee dedeee	j
f dee dee d;ee dee de*fd<d=Z+		dIded&ed9ed*edee dee dee dee dee dedeee	j
f dee de*fd>d?Z,			dFdee dedededed@edee d&ee d6ee defdAdBZ-  Z.S )JAzureChatCompletionr(   Nc                    s   t    d S r)   )superr.   r+   	__class__r*   r-   r.      s   zAzureChatCompletion.__init__rM   datatimeoutc              
   C   sX   z|j jjjdi |d|i}t|j}| }||fW S  ty+ } z|d}~ww )
        Helper to:
        - call chat.completions.create.with_raw_response when litellm.return_response_headers is True
        - call chat.completions.create by default
        rX   Nr*   )chatcompletionswith_raw_responsecreaterK   headersparse	Exception)r,   rM   rW   rX   raw_responser^   responseer*   r*   r-   .make_sync_azure_openai_chat_completion_request   s   

zBAzureChatCompletion.make_sync_azure_openai_chat_completion_requestlogging_objc              
      s   t   }z |jjjjdi |d|iI dH }t|j}| }||fW S  tyL }	 zt   }
t	|
| d}|	 j
d| d| d7  _
|	d}	~	w tyY }	 z|	d}	~	ww )rY   rX   Nr   z - timeout value=z, time taken=z secondsr*   )timerZ   r[   r\   r]   rK   r^   r_   r	   roundr7   r`   )r,   rM   rW   rX   re   
start_timera   r^   rb   rc   end_timeZ
time_deltar*   r*   r-   )make_azure_openai_chat_completion_request   s*   

z=AzureChatCompletion.make_azure_openai_chat_completion_requestFmodelmessagesmodel_responseapi_keyapi_baserN   api_typeazure_ad_tokenazure_ad_token_providerrO   print_verboseacompletionr^   c                 C   s  |r||d< z|d u s|d u rt ddd|dd }|d u r"t}|dd}|d urHd|v rH| j||||||||	|||d	}d |d
|}n$tjj|dr^t j|||||pZi d}nt j|||||pii d}|du r|	ddr| j
|||
||||||	||||dW S | j||||||||	|
||||||dW S d|v r|d du r| j|||
||||||	||||dW S |j||||d|||dd t|tst ddd| j|||||d|d}t|ttfst ddd| j|||d\}}t|trt dd|d d  d| }|j||||||dd t||||dW S  t y4 } z|d }~w typ } z0t|dd}t|dd }t|dd }t|d d }|d u rb|rbt|dd }t |t|||d!d }~ww )"Nextra_headers  zMissing model or messagesr8   r7   max_retries	json_modeFgateway.ai.cloudflare.com)ro   rk   rN   rx   rX   rn   rq   rr   rt   clientlitellm_paramsrk   rl   )rk   )rk   rl   r5   r|   r^   Tstream)re   ro   rO   rW   rk   rn   rN   rq   rr   rX   r{   rx   r|   )ro   rW   rm   rn   rN   rk   rq   rr   rO   rX   r{   re   rx   convert_tool_call_to_json_moder|   rn   rq   )r^   rN   ro   complete_input_dictinputrn   additional_argsmax retries must be an intrN   ro   rn   rk   r{   	_is_asyncr|     8azure_client is not an instance of AzureOpenAI or OpenAIrM   rW   rX   'Unexpected string response from Azure: )r^   rN   ro   r   rn   original_responser   )response_objectmodel_response_objectr   _response_headersr8   r^   rb   bodyr8   r7   r^   r   )r!   popr   Z,_init_azure_client_for_cloudflare_ai_gatewayr<   ZAzureOpenAIGPT5ConfigZis_model_gpt_5_modelZtransform_requestZAzureOpenAIConfiggetasync_streamingrt   	streamingpre_callr:   intget_azure_openai_clientr   r   rd   r;   
model_dump	post_callr   r`   getattr)r,   rk   rl   rm   rn   ro   rN   rp   rq   rr   rO   rs   rX   re   r5   r|   Z	logger_fnrt   r^   r{   rx   ry   rW   rM   rb   stringified_responserc   r8   error_headerserror_response
error_bodyr*   r*   r-   
completion   sD  
	

zAzureChatCompletion.completionrx   r   r|   c              
      s  d }zl| j |||||d|d}t|ttfstd|	j|d |j||d|d|dd | j||||	dI d H \}}||	jd	< t|t	rSt
d
d|d d
  d| }|	j|d ||d|id t||d|i||dW S  t
y } z|	j|d |d|it	|d |d }~w tjy } z|	j|d |d|it	|d t
d
t	|dd }~w ty } z+t|dt	|}t|dd }|	j|d |d|it	|d t|dr|t
d
||dd }~ww )NTr   BAzure client is not an instance of AsyncAzureOpenAI or AsyncOpenAIrl   r   r^   ro   rt   r   r   rM   rW   rX   re   response_headersr   r   rw   r   r   r^   )r   r   hidden_paramsr   r   r   rn   r   r   r7   r   r8   r8   r7   r   )r   r:   r
   r   
ValueErrorr   rn   rj   model_call_detailsr;   r!   r   r   r   asyncioCancelledErrorr`   r   hasattr)r,   rn   rN   rk   ro   rW   rX   rO   rm   re   rx   rq   rr   r   r{   r|   rb   rM   r^   r   rc   r7   r   r*   r*   r-   rt     s   	


zAzureChatCompletion.acompletionc              	   C   s   |||t j|	|d}t|d}|d ur||d< n|
d ur*|
dr%t|
}
|
|d< n|d ur2||d< | j|||||d|d}t|ttfsKt	d	d
d|j
|d |j||
d|d|dd | j|||d\}}t||d||dd t|d}|S )N)rN   azure_endpointZazure_deploymenthttp_clientrx   rX   )rL   rn   zoidc/rq   rr   Fr   r   r   rw   rl   r   Tr   r   r   azurestream_optionsZcompletion_streamrk   Zcustom_llm_providerre   r   r   )r<   client_sessionr%   
startswithr#   r   r:   r   r   r!   r   rn   rd   r   r   r$   )r,   re   ro   rn   rN   rO   rW   rk   rX   rx   rq   rr   r{   r|   rL   rM   r^   rb   streamwrapperr*   r*   r-   r     sn   


	

zAzureChatCompletion.streamingc              
      s   zN| j |||||d|d}t|ttfstd|j|d |j||
d|d|dd | j||||dI d H \}}||jd	< t	||d
||
dd |d}|W S  ty } z4t|dd}t|dd }t|dd }t|dt|}t|dd }|d u r|rt|dd }t||||dd }~ww )NTr   r   rl   r   r   r   r   r   r   r   r   r8   r   r^   rb   r7   r   r   )r   r:   r
   r   r   r   rn   rj   r   r   r   r`   r   r;   r!   )r,   re   ro   rn   rN   rO   rW   rk   rX   rx   rq   rr   r{   r|   rM   r^   rb   r   rc   r8   r   r   r7   r   r*   r*   r-   r   ;  sp   	

z#AzureChatCompletion.async_streamingr   r{   c              
      s\  d }z| j ||||d|	|d}t|ttfstd|jjjdi |d|
iI d H }t|j	}z|
 }W n tjyS } zt|jpEddt| d|d }~ww t|trit|jp^dd|d d  d| }|j||d	|i|d
 t||d|it|dd}t|tstddd|W S  ty } z|j||d	|it|d
 |d }~ww )NTrN   ro   rn   rk   r   r{   r|   r   rX   r   z.Failed to parse raw Azure embedding response: rw   r   r   r   r^   	embedding)r   r   r   r   response_typez:embedding_response is not an instance of EmbeddingResponser*   )r   r:   r
   r   r   
embeddingsr\   r]   rK   r^   r_   jsonJSONDecodeErrorr!   r8   r;   r   r   r   r$   r   r`   )r,   rk   rW   rm   r   re   ro   rn   rN   r{   rX   rx   rq   rr   r|   rb   Zopenai_aclientra   r^   Z
json_errorr   Zembedding_responserc   r*   r*   r-   
aembedding  s   	


zAzureChatCompletion.aembeddingr5   c                 C   s  |r||d< | j d u r|  | _ z||d|}|d u rtj}|j||	||	|
ddd |du rA| j|||||	|||||d
W S | j|||	|d||d	}t|tt	fsZt
d
dd|jjjdi |d|i}t|j}| }t|trt
|jp{d
d|d d
  d|j||	||d|d t| |dt|dW S  t
y } z|d }~w ty } z,t|dd
}t|dd }t|dd }t|}|d u r|rt|dd }|j}t
|||dd }~ww )Nru   )rk   r   r   )r   r^   r   T)
rW   r   rk   re   rn   rm   rX   r{   r|   ro   Fr   r   r   rw   rX   r   )r   ro   r   r   )r   r   r   r   r8   r^   rb   )r8   r7   r^   r*   )Z_client_sessionZcreate_client_sessionr<   r   r   r   r   r:   r   r   r!   r   r\   r]   rK   r^   r_   r;   r8   r   r   r   r$   r`   r   text)r,   rk   r   ro   rN   rX   re   rm   r5   rn   rq   rr   rx   r{   r   r^   r|   rW   rM   ra   rb   rc   r8   r   r   Z
error_textr*   r*   r-   r     s   

		

zAzureChatCompletion.embeddingc                    s8  |du r0i }|durt |tst |trt|}	|	|d< n	tjddd|d< ttj|d}
n|}
d|v r|dv rt|d	d
}|	dd |
j
|t||dI dH }d|jv ra|jd }ntd|jd|
j||dI dH }| I dH  t}t }d| vrtd| | d dvrt | |krtdddtt|jdpdI dH  |
j||dI dH }| I dH  | d dvs| d dkr| }|d|}t |tr|ddnt|}td||d| d }tjd|jt|d tjd!d"d#d$S |
j
|||d%I dH S )&
        Implemented for azure dall-e-2 image gen calls

        Alternative to needing a custom transport implementation
        NrX        @      @rX   connect)Zllm_providerparamsimages/generationsz2023-06-01-previewz2023-07-01-previewz2023-08-01-previewz2023-09-01-previewz2023-10-01-preview!/openai/images/generations:submitoriginal_urlnew_pathrk   urlrW   r^   operation-locationr   rw   r   r^   status%Expected 'status' in response. Got={}Z	succeededfailed  Operation polling timed out.retry-after
   r   errorr7   Image generation failedr6   r   result   utf-8POSThttps://api.openai.com/v1methodr   r8   r^   r0   requestr   r   r^   )r:   floatr   httpxTimeoutr   r   ZAZUREr   r   postr   dumpsr^   r!   r   r   Zareadr   rf   r`   r@   r   sleeprK   ResponseencodeRequest)r,   r{   rX   ro   rN   rn   rW   r^   _params_httpx_timeoutZasync_handlerrb   operation_location_urltimeout_secsrh   
error_data_error_body
_error_msgr   r*   r*   r-   make_async_azure_httpx_requestE  s   

	
 z2AzureChatCompletion.make_async_azure_httpx_requestc                 C   s  |du r4i }|durt |tst |trt|}	|	|d< n	tjddd|d< td&i |dtji}
n|}
d|v r|dv rt|d	d
}|	dd |
j
|t||d}d|jv rb|jd }ntd|jd|
j||d}|  t}t }d| vrtd| | d dvrt | |krtdddtt|jdpd |
j||d}|  | d dvs| d dkr| }|d|}t |tr|ddnt|}td||d| d }tjd|jt|d tjd!d"d#d$S |
j
|||d%S )'r   NrX   r   r   r   r{   r   r   r   r   rk   r   r   r   rw   r   r   r   r   r   r   r   r   r   r   r7   r   r6   r   r   r   r   r   r   r   r   r   r*   )r:   r   r   r   r   r   r<   r   r   r   r   r   r   r^   r!   r   r   readr   rf   r`   r@   r   rK   r   r   r   )r,   r{   rX   ro   rN   rn   rW   r^   r   r   Zsync_handlerrb   r   r   rh   r   r   r   r   r*   r*   r-   make_sync_azure_httpx_request  s   

	
z1AzureChatCompletion.make_sync_azure_httpx_requestrL   c                 C   s   ddl m} |dd}|dr|d}|dd}|d u r"d}||r/|j|||dS d|v r6|}n|d | }|d	7 }|d
| 7 }|S )Nr   )%AzureFoundryFluxImageGenerationConfigr    /rN   )ro   rk   rN   z/openai/deployments/z/images/generationsz?api-version=)Z&litellm.llms.azure_ai.image_generationr   r   endswithrstripZis_flux2_modelZget_flux2_image_generation_url)r,   rL   rk   r   ro   rN   Zbase_url_with_deploymentr*   r*   r-   create_azure_base_url&  s*   


z)AzureChatCompletion.create_azure_base_urlc              
      s4  d }z{| dd}|dr|d}| dd}| j||
p$| ddd}|j|d ||||dd	 | jd |	|||||d
I d H }t| dd}|d urf|j| dd||p\t ||||t	j
dW S | }|}|j||d|i|d t||ddW S  ty } z|j||d|it|d |d }~ww )Nro   r   r   rN   rk   rL   rk   promptr   ro   r^   r   r{   rX   ro   rN   rn   rW   r^   zdall-e-2)rk   ra   rm   re   Zrequest_datar5   r|   encodingr   r   image_generationr   r   r   )r   r   r   r   r   r   r&   Z#transform_image_generation_responser   r<   r   r   r   r   r`   r;   )r,   rW   rm   rL   rn   r   re   r^   r{   rX   rk   rb   ro   rN   img_gen_api_basehttpx_responseZprovider_configr   rc   r*   r*   r-   aimage_generationI  s   

	


z%AzureChatCompletion.aimage_generationr   c                 C   s  z|rt |dkr|}nd }|
d ur'|d ur'|dd d ur'|dd |
jd< |di }i ||}|r;|dd nd }|p@||d|}|dd}t|tsWtdd	d
|d u rq|d urq| }|rq|dd  d| |d< | j|pvi ||pzd|	|dd}|du r| j|t	||
||||||d
W S | j
||d}|j|d ||||dd | jd |||	pd|pd||d}| }|j||d|i|d t||
ddW S  ty } z|d }~w ty } zt|dd }|d urt|t|d
tdt|d
d }~ww )Nr   
base_modelrk   
extra_body)rk   r   rx   r   rv   r   rw   zapi-keyzBearer Authorizationr   F)r|   rn   Z
model_namerN   ro   is_asyncT)
rW   r   re   rm   rn   r{   rL   rX   r^   rk   r   r   r   r   r   r   r   r   r  r8   r   )lenr   Z_hidden_paramsr   r:   r   r!   Zinitialize_azure_sdk_clientr  r   r   r   r   r   r   r   r`   r   r;   )r,   r   rX   r5   re   r^   rk   rn   ro   rN   rm   rq   rr   r{   Zaimg_generationr|   r  Zflattened_paramsr  rW   rx   rL   r  r  rb   rc   Z
error_coder*   r*   r-   r     s   
 		z$AzureChatCompletion.image_generationvoiceorganizationaspeechc                 C   s   | dd}	|d ur |du r | j||||||||||	|
||dS | j||||d||d}|jjjd	|||d|}t|jdS )
Nrx   r   T)rk   r   r
  r5   rn   ro   rN   rq   rr   rx   rX   r{   r|   Fro   rN   rn   rk   r   r{   r|   rk   r
  r   rb   r*   )r   async_audio_speechr   audiospeechr]   r   rb   )r,   rk   r   r
  r5   rn   ro   rN   r  rx   rX   rq   rr   r  r{   r|   rM   rb   r*   r*   r-   audio_speech  sD   

z AzureChatCompletion.audio_speechc              	      sH   | j ||||d||d}|jjjd|||d|I d H }t|jdS )NTr  r  r  r*   )r   r  r  r]   r   rb   )r,   rk   r   r
  r5   rn   ro   rN   rq   rr   rx   rX   r{   r|   rM   Zazure_responser*   r*   r-   r  B  s$   

z&AzureChatCompletion.async_audio_speechmodec
              
   C   sL  t jpt }
|d ur)d|v r)|ds|d7 }|| 7 }t|||||
d}d }nt|||||
d}|d u r>|dkr>tdd }|d u rJddd	g}z|jjj	j
||d
}W n tyd } z|d }~ww i }|d u spt|dsttd|jdd d ur|jd |d< |jdd d ur|jd |d< |jdd d ur|jd |d< |S )Nrz   r   )base_urlrN   rn   rX   r   )rN   r   rn   rX   r   r   zmodel is not setuserZHey)r/   r0   r}   r^   zinvalid completion responsezx-ratelimit-remaining-requestszx-ratelimit-remaining-tokenszx-ms-region)r<   r   r   ZClientr   r   r`   rZ   r[   r\   r]   r   r^   r   )r,   rk   rn   ro   rN   rX   r  rl   r   r   r   r{   r   rc   rb   r*   r*   r-   get_headerse  s`   

	

zAzureChatCompletion.get_headersrF   )FNN)NNNNNNNN)NNN)
NNNNNNNNNN)NNNNN)NN)/rG   rH   rI   r.   r   r   r   rK   r   r   r   rd   r   r
   r   LiteLLMLoggingObjrj   r;   r>   r   r   r   boolr   r   r   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r  r  __classcell__r*   r*   rU   r-   rS      s:   


/	

 S	

w	

Y	

U	

f	

a	
r	
o
,
`	

u	

D	

+	
rS   )9r   r   rf   typingr   r   r   r   r   r   r   r   Zopenair	   r
   r   r   r   r<   Zlitellm.constantsr   r   Z*litellm.litellm_core_utils.litellm_loggingr   r  Z(litellm.litellm_core_utils.logging_utilsr   Z&litellm.llms.custom_httpx.http_handlerr   r   r   Zlitellm.types.utilsr   r   r   r   Zlitellm.utilsr   r   r   Ztypes.llms.openair   baser   Zcommon_utilsr!   r"   r#   r$   r%   r   r&   r'   rK   r  rR   rS   r*   r*   r*   r-   <module>   s4    $>
