Ë
    uPêjR8  ã                   óV  — U d dl Z d dlZd dlZd dlmZmZmZ d dl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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 d dl m!Z! d dl"m#Z#m$Z$ d dl%m&Z&m'Z' erd dl(Z( G d„ de)ejT                  «      Z+dZ,ee-d<    G d„ de«      Z.y)é    N)ÚTYPE_CHECKINGÚFinalÚcast)Úurlparse)ÚResponse)Úverbose_logger)Ú"_audio_or_image_in_message_contentÚconvert_content_list_to_strÚfilter_value_from_dict)ÚBaseAzureLLM)ÚLiteLLMLoggingObj)Ú+drop_params_from_unprocessable_entity_error)ÚOpenAIConfig)ÚXAIChatConfig)Úget_secret_str)ÚAllMessageValues)ÚGenericLiteLLMParams)ÚModelResponseÚProviderField)Ú_add_path_to_api_baseÚsupports_tool_choicec                   ó   — e Zd ZdZy)ÚAzureFoundryErrorStringsz&Set extra-parameters to 'pass-through'N)Ú__name__Ú
__module__Ú__qualname__Ú$SET_EXTRA_PARAMETERS_TO_PASS_THROUGH© ó    ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/azure_ai/chat/transformation.pyr   r       s   „ Ø+SÑ(r   r   )Úthinking_blocksÚreasoning_contentÚprovider_specific_fieldsÚcache_controlÚNON_OPENAI_SPEC_MESSAGE_FIELDSc                   ó„  ‡ — e Zd Zdedefˆ fd„Zdedefd„Z	 	 d'dededee	   ded	ed
edz  dedz  defd„Z
dedefd„Z	 d(dedz  d
edz  deded	ededz  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dz  defd„Zdededz  d
edz  dedeedz  edz  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dd
edz  dedz  defˆ fd„Zdej2                  d	edefˆ fd„Zd edefd!„Zedefd"„«       Zdej2                  dedefd#„Zded edefd$„Z ded edefd%„Z!d edee   dz  fd&„Z"ˆ xZ#S ))ÚAzureAIStudioConfigÚmodelÚreturnc                 óê   •— d}t        d|› �¬«      sd}t        ‰| �	  |«      }|s"g }|D ]  }|dk7  sŒ	|j                  |«       Œ |}| j	                  |«      s|D �cg c]
  }|dk7  sŒ	|‘Œ }}|S c c}w )NTú	azure_ai/)r(   FÚtool_choiceÚstop)r   ÚsuperÚget_supported_openai_paramsÚappendÚ_supports_stop_reason)Úselfr(   Úmodel_supports_tool_choiceÚsupported_paramsÚfiltered_supported_paramsÚparamÚ	__class__s         €r    r/   z/AzureAIStudioConfig.get_supported_openai_params-   s›   ø€ Ø%)Ð"Ü#¨I°e°WÐ*=Õ>Ø).Ð&Ü ™7Ñ>¸uÓEÐÙ)Ø/1Ð%Ø)ò <�Ø˜MÓ)Ø-×4Ñ4°UÕ;ð<ð  9Ðð ×)Ñ)¨%Ô0Ø3CÖW¨%ÀuÐPVÃ¢ÐWÐÐWàÐùò  Xs   Á
A0Á(A0c                 óB   — d|v rt        «       }|j                  |«      S y)z:
        Check if the model supports stop tokens.
        ÚgrokT)r   r1   )r2   r(   Ú
xai_configs      r    r1   z)AzureAIStudioConfig._supports_stop_reason?   s&   € ð �U‰?ä -£ˆJØ×3Ñ3°EÓ:Ð:Ør   NÚheadersÚmessagesÚoptional_paramsÚlitellm_paramsÚapi_keyÚapi_basec                 óÀ   — |r"|r| j                  |«      r||d<   n=d|› �|d<   n4t        di t        |t        «      r|ni ¤Ž}t	        j
                  ||¬«      }d|d<   |S )Nzapi-keyzBearer ÚAuthorization)r;   r>   zapplication/jsonzContent-Typer   )Ú_should_use_api_key_headerr   Ú
isinstanceÚdictr   Ú _base_validate_azure_environment)	r2   r;   r(   r<   r=   r>   r?   r@   Úlitellm_params_objs	            r    Úvalidate_environmentz(AzureAIStudioConfig.validate_environmentI   sr   € ñ Ù˜D×;Ñ;¸HÔEØ%,�˜	Ò"à-4°W°IÐ+>�˜Ò(ô "6Ñ!uÌ:ÐVdÔfjÔKk¹ÐqsÑ!uÐÜ"×CÑCÈGÐdvÔwˆGà"4ˆ�Ñàˆr   c                 ó|   — t        |«      }|j                  }|r#|j                  d«      s|j                  d«      ryy)z]
        Returns True if the request should use `api-key` header for authentication.
        z.services.ai.azure.comz.openai.azure.comTF)r   ÚhostnameÚendswith)r2   r@   Ú
parsed_urlÚhosts       r    rC   z.AzureAIStudioConfig._should_use_api_key_headera   s:   € ô % XÓ.ˆ
Ø ×)Ñ)ˆÙ�T—]‘]Ð#;Ô<ÀÇÁÐNaÔ@bØØr   Ústreamc                 óp  — |€t        d|› d�«      ‚t        j                  |«      }t        t        dz  |j                  d«      «      }t        |j                  «      }	d|	vr|r||	d<   d|v rt        |d¬«      }
nt        |d	¬«      }
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"
        Nz^api_base is required for Azure AI Studio. Please set the api_base parameter. Passed `api_base=ú`Úapi_versionzapi-versionzservices.ai.azure.comz/models/chat/completions)r@   Úending_pathz/chat/completions)Úparams)
Ú
ValueErrorÚhttpxÚURLr   ÚstrÚgetrE   rS   r   Ú	copy_with)r2   r@   r?   r(   r=   r>   rN   Úoriginal_urlrQ   Úquery_paramsÚnew_urlÚ	final_urls               r    Úget_complete_urlz$AzureAIStudioConfig.get_complete_urlk   sÇ   € ð2 ÐÜØpÐqyÐpzÐz{Ð|óð ô $Ÿi™i¨Ó1ˆô "¤#¨¡*¨n×.@Ñ.@ÀÓ.OÓPˆô # <×#6Ñ#6Ó7ˆð  Ñ,±Ø*5ˆL˜Ñ'ð # hÑ.Ü+°XÐKeÔf‰Gä+°XÐK^Ô_ˆGô !Ÿ9™9 WÓ-×7Ñ7¸|Ð7ÓLˆ	ä�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   ©r2   s    r    Úget_required_paramsz'AzureAIStudioConfig.get_required_paramsŸ   s8   € ô Ø$Ø#Ø"AØ$ô	ô Ø%Ø#Ø"BØ9ô	ð
ð 	
r   c                 óÌ   — t        j                  |«      }|D ]I  }t        t        |«      }t        D ]  }t        ||«       Œ t        |«      rŒ6t        |¬«      }|sŒE||d<   ŒK |S )aC  
        - Azure AI Studio doesn't support content as a list. This handles:
            1. Strips message fields that are not part of the OpenAI chat-completions
               schema (thinking_blocks, reasoning_content, provider_specific_fields,
               cache_control).
               Azure AI Foundry backends set additionalProperties=false and reject
               these with "Extra inputs are not permitted", which breaks multi-turn
               Anthropic-format clients that echo thinking blocks back as history.
            2. Transforms list content to a string.
            3. If message contains an image or audio, send as is (user-intended)

        Operates on a deep copy so the caller's messages keep their thinking blocks
        and provider metadata, which a fallback to another provider still needs.
        )ÚmessageÚcontent)ÚcopyÚdeepcopyr   rE   r%   r   r	   r
   )r2   r<   r(   Ústripped_messagesrh   Úmessage_dictÚfieldÚtextss           r    Ú_transform_messagesz'AzureAIStudioConfig._transform_messages°   ss   € ô& $(§=¡=°Ó#:ÐØ(ò 	+ˆGÜ¤ gÓ.ˆLÜ7ò <�Ü& |°UÕ;ð<ô 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)r2   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|«       d}|||fS )NÚAZURE_AI_API_BASEÚAZURE_AI_API_KEY)r(   r@   zDModel=%s is Azure OpenAI model. Setting custom_llm_provider='azure'.Úazure)r   rz   r   Údebug)r2   r(   r@   r?   r{   Údynamic_api_keys         r    Ú$_get_openai_compatible_provider_infoz8AzureAIStudioConfig._get_openai_compatible_provider_infoá   s]   € ð ÒBœ~Ð.AÓBˆØ!(Ò!N¬NÐ;MÓ,Nˆà×&Ñ&¨U¸XÐ&ÔFÜ× Ñ Ð!gÐinÔoØ")ÐØ˜Ð*=Ð=Ð=r   c                 ó¸   •— |j                  di «      }|r!t        |t        «      r|j                  |«       |j                  dd «       t        ‰| �  |||||«      S )NÚ
extra_bodyÚmax_retries)ÚpoprD   rE   Úupdater.   Útransform_request)r2   r(   r<   r=   r>   r;   r„   r7   s          €r    rˆ   z%AzureAIStudioConfig.transform_requestð   sZ   ø€ ð ,×/Ñ/°¸bÓAˆ
Ùœ* Z´Ô6Ø×"Ñ" :Ô.Ø×Ñ˜M¨4Ô0Ü‰wÑ(¨°¸/È>Ð[bÓcÐcr   Úraw_responseÚmodel_responseÚlogging_objÚrequest_dataÚencodingztiktoken.Encoding | NoneÚ	json_modec                 óT   •— d|› �|_         t        ‰| �	  |||||||||	�|	nd |
|¬«      S )Nr+   )r(   r‰   rŠ   r‹   rŒ   r<   r=   r>   r�   r?   rŽ   )r(   r.   Útransform_response)r2   r(   r‰   rŠ   r‹   rŒ   r<   r=   r>   r�   r?   rŽ   r7   s               €r    r�   z&AzureAIStudioConfig.transform_responseþ   sS   ø€ ð "+¨5¨'Ð2ˆÔÜ‰wÑ)ØØ%Ø)Ø#Ø%ØØ+Ø)Ø!)Ð!5‘X¸4ØØð *ó 
ð 	
r   Úec                 ó  •— |j                  d«      xs t        j                  }|j                  j                  }d|v r|s| j                  |«      ryd|v ryt        j                  j                  |v ryt        ‰| �)  ||¬«      S )NÚdrop_paramsúExtra inputs are not permittedTú3unknown field: parameter index is not a valid field)r‘   r>   )rX   ru   r“   ÚresponseÚtextÚ"_error_has_tool_level_extra_fieldsr   r   Úvaluer.   Ú9should_retry_llm_api_inside_llm_translation_on_http_error)r2   r‘   r>   Úshould_drop_paramsÚ
error_textr7   s        €r    rš   zMAzureAIStudioConfig.should_retry_llm_api_inside_llm_translation_on_http_error  sƒ   ø€ ð %3×$6Ñ$6°}Ó$EÒ$\Ì×I\ÑI\ÐØŸJ™JŸO™Oˆ
à+¨zÑ9Ù! T×%LÑ%LÈZÔ%XØØ@ÀJÑNØÜ#×HÑH×NÑNÐR\Ñ\ØÜ‰wÑPÐSTÐesÐPÓtÐtr   rœ   c                 ó@   — t        t        j                  d|«      «      S )Nztools\[\d+\]\.)ÚboolÚreÚsearch)r2   rœ   s     r    r˜   z6AzureAIStudioConfig._error_has_tool_level_extra_fields*  s   € Ü”B—I‘IÐ/°Ó<Ó=Ð=r   c                  ó   — y)Né   r   re   s    r    Ú'max_retry_on_unprocessable_entity_errorz;AzureAIStudioConfig.max_retry_on_unprocessable_entity_error-  s   € àr   c                 ó‚  — |j                   j                  }t        t        t           d z  |j                  d«      «      }d|v r|�t        j                  |¬«       n.t        j                  j                  |v r| j                  ||«      }d|v r#| j                  |«      r| j                  ||«      }t        ||¬«      }|S )Nr<   r•   )r<   r”   )r‘   Údata)r–   r—   r   Úlistr   rX   ru   Úremove_index_from_tool_callsr   r   r™   Ú$_drop_extra_params_from_request_datar˜   Ú_drop_tool_level_extra_fieldsr   )r2   r‘   rŒ   rœ   Ú	_messagesr¥   s         r    Ú/transform_request_on_unprocessable_entity_errorzCAzureAIStudioConfig.transform_request_on_unprocessable_entity_error1  s´   € ØŸJ™JŸO™Oˆ
Ü¤Ô%5Ñ 6¸Ñ =¸|×?OÑ?OÐPZÓ?[Ó\ˆ	Ø@ÀJÑNÐS\ÐShÜ×0Ñ0Ø"öô &×JÑJ×PÑPÐT^Ñ^Ø×DÑDÀ\ÐS]Ó^ˆLØ+¨zÑ9¸d×>eÑ>eÐfpÔ>qØ×=Ñ=¸lÈJÓWˆLÜAÀAÈLÔYˆØˆr   c                 óì   — t        t        j                  d|«      «      }|j                  d«      }|rAt	        |t
        «      r1|D ],  }t	        |t        «      sŒ|D ]  }|j                  |d «       Œ Œ. |S )Nztools\[\d+\]\.([\w-]+)Útools)ÚsetrŸ   ÚfindallrX   rD   r¦   rE   r†   )r2   rŒ   rœ   Úfields_to_dropr­   Útoolrn   s          r    r©   z1AzureAIStudioConfig._drop_tool_level_extra_fields?  sr   € Ü #¤B§J¡JÐ/HÈ*Ó$UÓ VˆØ#×'Ñ'¨Ó0ˆÙœj¨´Ô5Øò .�Ü˜d¤DÕ)Ø!/ò .˜ØŸ™ ¨Õ-ñ.ð.ð Ðr   c                 óh   — | j                  |«      }|r|D ]  }||v sŒ|j                  |d «       Œ |S ©N)Ú'_extract_params_to_drop_from_error_textr†   )r2   rŒ   rœ   Úparams_to_dropr6   s        r    r¨   z8AzureAIStudioConfig._drop_extra_params_from_request_dataI  sD   € Ø $× LÑ LÈZÓ XˆÙØ'ò 2�Ø˜LÒ(Ø ×$Ñ$ U¨DÕ1ð2ð Ðr   c                 ó  — t        j                  d|«      }|sg S |j                  d«      }g }|j                  d«      D ]D  }|j	                  «       j	                  d«      j	                  d«      }|sŒ4|j                  |«       ŒF |S )z¹
        Error text looks like this"
            "Extra parameters ['stream_options', 'extra-parameters'] are not allowed when extra-parameters is not set or set to be 'error'.
        z	\[(.*?)\]rs   ú,ú'ú")rŸ   r    Úgrouprt   Ústripr0   )r2   rœ   ÚmatchÚ
params_strrS   r6   Úclean_params          r    r´   z;AzureAIStudioConfig._extract_params_to_drop_from_error_textQ  s�   € ô
 —y‘y ¨zÓ:ˆÙØˆIð "ŸK™K¨›Nˆ
ØˆØ×%Ñ% cÓ*ò 	+ˆEàŸ+™+›-×-Ñ-¨cÓ2×8Ñ8¸Ó=ˆKÚØ—‘˜kÕ*ð		+ð
 ˆr   )NNr³   )$r   r   r   rW   r¦   r/   rž   r1   rE   r   rH   rC   r^   r   rf   rp   rz   Útupler‚   rˆ   r   r   r   r�   rU   ÚHTTPStatusErrorrš   r˜   ÚpropertyÚintr£   r«   r©   r¨   r´   Ú__classcell__)r7   s   @r    r'   r'   ,   sP  ø„ ð °ð  ¸õ  ð$¨3ð °4ó ð" #Ø#ñàðð ðð Ð'Ñ(ð	ð
 ðð ðð �t‘ðð ˜‘*ðð 
óð0°3ð ¸4ó ð" #ñ2à˜‘*ð2ð �t‘ð2ð ð	2ð
 ð2ð ð2ð �t‘ð2ð 
ó2ðh
 T¨-Ñ%8ó 
ð" !àÐ'Ñ(ð !ð ð !ð 
ó	 !ðD¨Cð ¸3À¹:ð È$ó ð>àð>ð ˜‘*ð>ð �t‘ð	>ð
 !ð>ð 
ˆs�T‰z˜3 ™: sÐ*Ñ	+ó>ðdàðdð Ð'Ñ(ðdð ð	dð
 ðdð ðdð 
õdð2 #Ø!%ñ
àð
ð ð
ð &ð	
ð
 'ð
ð ð
ð Ð'Ñ(ð
ð ð
ð ð
ð -ð
ð �t‘ð
ð ˜$‘;ð
ð 
õ
ð:uØ×&Ñ&ðuØ8<ðuà	õuð>¸Sð >ÀTó >ð ð¸ò ó ððÀ×AVÑAVð Ðfjð Ðosó ð¸$ð ÈCð ÐTXó ðÀð ÐSVð Ð[_ó ðÀ#ð È$ÈsÉ)ÐVZÑJZ÷ r   r'   )/rj   ÚenumrŸ   Útypingr   r   r   Úurllib.parser   rU   r   ru   Úlitellm._loggingr   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr	   r
   r   Úlitellm.llms.azure.common_utilsr   Ú)litellm.llms.base_llm.chat.transformationr   Ú litellm.llms.openai.common_utilsr   Úlitellm.llms.openai.openair   Ú$litellm.llms.xai.chat.transformationr   Úlitellm.secret_managers.mainr   Úlitellm.types.llms.openair   Úlitellm.types.routerr   Úlitellm.types.utilsr   r   Úlitellm.utilsr   r   ÚtiktokenrW   ÚEnumr   r%   Ú__annotations__r'   r   r   r    ú<module>rÖ      s„   ðÜ Û Û 	ß -Ñ -Ý !ã Ý ã Ý +÷ñ õ
 9Ý GÝ XÝ 3Ý >Ý 7Ý 6Ý 5ß <ß EáÛôT˜s D§I¡Iô Tð)Ð  ó ôv˜,õ vr   