
    g                          d dl mZmZmZmZmZ d dlZd dlmZ d dlZd dl	m
Z
 d dlmZ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mZ d dlmZ  G d de      Zy)    )AnyListOptionalTuplecastN)Response)verbose_logger"_audio_or_image_in_message_contentconvert_content_list_to_str)LiteLLMLoggingObj)+drop_params_from_unprocessable_entity_error)OpenAIConfig)get_secret_str)AllMessageValues)ModelResponseProviderField)_add_path_to_api_basec                       e Zd Z	 	 ddededee   dedee   dee   defdZ	 ddededed	ee	   def
d
Z
dee   fdZdee   dedefdZdedee   de	fdZdedee   dee   dedeee   ee   ef   f
dZdedee   dedededef fdZ	 	 ddedededededee   dedededee   dee	   def fdZdej0                  dede	f fdZedefd       Zdej0                  dedefdZ xZS )AzureAIStudioConfigheadersmodelmessagesoptional_paramsapi_keyapi_basereturnc                 0    |rd|v r||d<   |S d| |d<   |S )Nservices.ai.azure.comzapi-keyzBearer Authorization )selfr   r   r   r   r   r   s          ^/var/www/openai/venv/lib/python3.12/site-packages/litellm/llms/azure_ai/chat/transformation.pyvalidate_environmentz(AzureAIStudioConfig.validate_environment   s8     /8;!(GI  *1	':GO$    streamc                 l   t        j                  |      }t        t        t           |j                  d            }d|j                  vr|r||j                  d<   d|v rt        |d      }nt        |d      }|j                  }t        j                  |      j                  |      }	t	        |	      S )a  
        Constructs a complete URL for the API request.

        Args:
        - api_base: Base URL, e.g.,
            "https://litellm8397336933.services.ai.azure.com"
            OR
            "https://litellm8397336933.services.ai.azure.com/models/chat/completions?api-version=2024-05-01-preview"
        - model: Model name.
        - optional_params: Additional query parameters, including "api_version".
        - stream: If streaming is required (optional).

        Returns:
        - A complete URL string, e.g.,
        "https://litellm8397336933.services.ai.azure.com/models/chat/completions?api-version=2024-05-01-preview"
        api_versionzapi-versionr   z/models/chat/completions)r   ending_pathz/chat/completions)params)	httpxURLr   r   strgetr*   r   	copy_with)
r"   r   r   r   r&   original_urlr(   new_urlquery_params	final_urls
             r#   get_complete_urlz$AzureAIStudioConfig.get_complete_url&   s    . yy* 8C=/*=*=m*LM  3 331<L. #h.+!/IG ,!/BG
 $**IIg&000E	9~r%   c                 >    t        dddd      t        dddd      gS )	zDFor a given provider, return it's required fields with a descriptionr   stringzYour Azure AI Studio API Key.zzEJ...)
field_name
field_typefield_descriptionfield_valuer   zYour Azure AI Studio API Base.zhttps://Mistral-serverless.)r   r"   s    r#   get_required_paramsz'AzureAIStudioConfig.get_required_paramsW   s8     $#"A$	 %#"B9	
 	
r%   c                 T    |D ]"  }t        |      rt        |      }|s||d<   $ |S )z
        - Azure AI Studio doesn't support content as a list. This handles:
            1. Transforms list content to a string.
            2. If message contains an image or audio, send as is (user-intended)
        )messagecontentr
   )r"   r   r   r>   textss        r#   _transform_messagesz'AzureAIStudioConfig._transform_messagesh   s9      G 2':/@E%*	"   r%   c                     	 d|v r|j                  dd      d   }|t        j                  v s$|t        j                  v s|t        j                  v ry	 y# t
        $ r Y yw xY w)N/   TF)splitlitellmopen_ai_chat_completion_modelsopen_ai_text_completion_modelsopen_ai_embedding_models	Exception)r"   r   r   s      r#   _is_azure_openai_modelz*AzureAIStudioConfig._is_azure_openai_model}   sn    	e|C+A.???GBBBG<<< =   		s   AA 	A A custom_llm_providerc                     |xs t        d      }|xs t        d      }| j                  ||      r&t        j                  dj	                  |             d}|||fS )NAZURE_AI_API_BASEAZURE_AI_API_KEY)r   r   zDModel={} is Azure OpenAI model. Setting custom_llm_provider='azure'.azure)r   rK   r	   debugformat)r"   r   r   r   rL   dynamic_api_keys         r#   $_get_openai_compatible_provider_infoz8AzureAIStudioConfig._get_openai_compatible_provider_info   sl     B~.AB!G^4F%G&&UX&F  V]]
 #**===r%   litellm_paramsc                     |j                  di       }|r!t        |t              r|j                  |       |j                  dd        t        |   |||||      S )N
extra_bodymax_retries)pop
isinstancedictupdatesupertransform_request)r"   r   r   r   rU   r   rW   	__class__s          r#   r^   z%AzureAIStudioConfig.transform_request   s^     %((r:
*Z6"":.M40w(8_ng
 	
r%   raw_responsemodel_responselogging_objrequest_dataencoding	json_modec                 L    d| |_         t        | 	  |||||||||	|
|      S )Nz	azure_ai/)r   r`   ra   rb   rc   r   r   rU   rd   r   re   )r   r]   transform_response)r"   r   r`   ra   rb   rc   r   r   rU   rd   r   re   r_   s               r#   rg   z&AzureAIStudioConfig.transform_response   sL     "+5'2w)%)#%+) * 
 	
r%   ec                     |j                  d      xs t        j                  }|j                  j                  }|rd|v ryd|v ryt
        |   ||      S )Ndrop_paramszExtra inputs are not permittedT3unknown field: parameter index is not a valid field)rh   rU   )r.   rF   rj   responsetextr]   9should_retry_llm_api_inside_llm_translation_on_http_error)r"   rh   rU   should_drop_params
error_textr_   s        r#   rn   zMAzureAIStudioConfig.should_retry_llm_api_inside_llm_translation_on_http_error   sd     ,//>U'BUBUZZ__
"Bj"PAZOwP Q 
 	
r%   c                      y)N   r!   r;   s    r#   'max_retry_on_unprocessable_entity_errorz;AzureAIStudioConfig.max_retry_on_unprocessable_entity_error   s    r%   c                     t        t        t        t              |j	                  d            }d|j
                  j                  v r|t        j                  |       t        ||      }|S )Nr   rk   )r   )rh   data)
r   r   r   r   r.   rl   rm   rF   remove_index_from_tool_callsr   )r"   rh   rc   	_messagesru   s        r#   /transform_request_on_unprocessable_entity_errorzCAzureAIStudioConfig.transform_request_on_unprocessable_entity_error   s`     $'7"89<;K;KJ;WX	AQZZ__T%00" ;Q\Rr%   )NN)N)__name__
__module____qualname__r[   r-   r   r   r   r$   boolr4   r   r<   rA   rK   r   rT   r^   r   r   r   r   rg   r+   HTTPStatusErrorrn   propertyintrs   rx   __classcell__)r_   s   @r#   r   r      s    "&"&  '(	
  # 3- 
* "&// / 	/
 / 
/b
T-%8 
"'(  
	*C 8C= T >> 3-> #	>
 !> 
x}hsmS0	1>&

 '(
 	

 
 
 

6 "&$(

 
 &	

 '
 
 '(
 
 
 
 #
 D>
 

:
&&
8<
	
   &&6:	r%   r   )typingr   r   r   r   r   r+   r   rF   litellm._loggingr	   8litellm.litellm_core_utils.prompt_templates.common_utilsr   r   )litellm.llms.base_llm.chat.transformationr    litellm.llms.openai.common_utilsr   litellm.llms.openai.openair   litellm.secret_managers.mainr   litellm.types.llms.openair   litellm.types.utilsr   r   litellm.utilsr   r   r!   r%   r#   <module>r      sB    3 3    + H X 3 7 6 < /V, Vr%   