Ë
    tPêjÏ  ã                   óŠ   — U d dl 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 erd dlmZ dZeed<   d	Zeed
<    G d„ d«      Zy)é    N)ÚTYPE_CHECKINGÚAnyÚFinal)Úverbose_proxy_logger©Úget_last_user_message)Úget_async_httpx_clientÚhttpxSpecialProvider)ÚAllMessageValuesi'  Ú$AZURE_CONTENT_SAFETY_MAX_TEXT_LENGTHiè  Ú'AZURE_CONTENT_SAFETY_TEXT_RECORD_LENGTHc                   ó˜   ‡ — e Zd ZdZdededefˆ fd„Zdedeeef   deeef   fd	„Ze	d
ede
dee   fd„«       Zded   dedz  fd„Zˆ xZS )ÚAzureGuardrailBasezÕ
    Base class for Azure guardrails.

    Provides shared initialisation (API credentials, HTTP client) and
    utilities (text splitting, authenticated POST) used by all Azure
    Content Safety guardrails.
    Úapi_keyÚapi_baseÚkwargsc                 ó²   •— t        ‰| �  di |¤Ž t        t        j                  ¬«      | _        || _        || _        |j                  d«      xs d| _	        y )N)Úllm_providerÚapi_versionz
2024-09-01© )
ÚsuperÚ__init__r	   r
   ÚGuardrailCallbackÚasync_handlerr   r   Úgetr   )Úselfr   r   r   Ú	__class__s       €úx/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/guardrails/guardrail_hooks/azure/base.pyr   zAzureGuardrailBase.__init__!   sM   ø€ ô 	‰ÑÑ"˜6Ò"ä3ÔAU×AgÑAgÔhˆÔØˆŒØ ˆŒØ &§
¡
¨=Ó 9Ò I¸\ˆÕó    Úendpoint_pathÚrequest_bodyÚreturnc              ƒ   ó4  K  — | j                   › d|› d| j                  › �}| j                  ddœ}t        j                  d||«       | j
                  j                  |||¬«      ƒ d{  –—† }|j                  «       }t        j                  d||«       |S 7 Œ-­w)	aA  POST to an Azure Content Safety endpoint with standard auth headers.

        Args:
            endpoint_path: The API action, e.g. ``"text:shieldPrompt"`` or
                ``"text:analyze"``.
            request_body: JSON-serialisable request payload.

        Returns:
            Parsed JSON response dict.
        z/contentsafety/z?api-version=zapplication/json)zOcp-Apim-Subscription-KeyzContent-Typez%Azure Content Safety request [%s]: %s)ÚurlÚheadersÚjsonNz&Azure Content Safety response [%s]: %s)r   r   r   r   Údebugr   Úpostr&   )r   r    r!   r$   r%   ÚresponseÚresponse_jsons          r   Ú_post_to_content_safetyz*AzureGuardrailBase._post_to_content_safety0   s¦   è ø€ ð Ÿ™� o°m°_ÀMÐRV×RbÑRbÐQcÐdˆà)-¯©Ø.ñ
ˆô
 	×"Ñ"Ð#JÈMÐ[gÔhØ $× 2Ñ 2× 7Ñ 7ØØØð !8ó !
÷ 
ˆð
 08¯}©}«ˆÜ×"Ñ"Ð#KÈ]Ð\iÔjØÐð
ús   ‚A&BÁ(BÁ).BÚtextÚ
max_lengthc                 ój  — t        | «      |k  r| gS t        j                  d| «      }g }d}|D ]o  }t        |«      t        |«      z   |k  r||z  }Œ#|r|j                  |«       d}t        |«      |kD  r(|j                  |d| «       ||d }t        |«      |kD  rŒ(|}Œq |r|j                  |«       |S )uÓ  
        Split text into chunks at word boundaries without breaking words.

        Always returns at least one chunk.  Short text (â‰¤ max_length) is
        returned as a single-element list so callers can use a uniform
        loop without branching on length.

        Args:
            text: The text to split
            max_length: Maximum character length of each chunk

        Returns:
            List of text chunks, each not exceeding max_length
        z\S+|\s+Ú N)ÚlenÚreÚfindallÚappend)r,   r-   ÚtokensÚchunksÚcurrent_chunkÚtokens         r   Úsplit_text_by_wordsz&AzureGuardrailBase.split_text_by_wordsK   sÐ   € ô  ˆt‹9˜
Ò"Ø�6ˆMô
 Ÿ
™
 :¨tÓ4ˆà#%ˆØˆàò 	&ˆEä�=Ó!¤C¨£JÑ.°*Ò<Ø Ñ&‘ñ !Ø—M‘M -Ô0Ø$&�Mô ˜%“j :Ò-Ø—M‘M %¨¨Ð"4Ô5Ø! * +Ð.�Eô ˜%“j :Ó-ð !&‘ð	&ñ" Ø�M‰M˜-Ô(àˆr   Úmessagesr   Nc                 ó   — t        |«      S )a‘  
        Get the last consecutive block of messages from the user.

        Example:
        messages = [
            {"role": "user", "content": "Hello, how are you?"},
            {"role": "assistant", "content": "I'm good, thank you!"},
            {"role": "user", "content": "What is the weather in Tokyo?"},
        ]
        get_user_prompt(messages) -> "What is the weather in Tokyo?"
        r   )r   r9   s     r   Úget_user_promptz"AzureGuardrailBase.get_user_prompt|   s   € ô % XÓ.Ð.r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr   r   Údictr+   ÚstaticmethodÚintÚlistr8   r;   Ú__classcell__)r   s   @r   r   r      sª   ø„ ñðJàðJð ðJð õ	Jð¸3ð ÈdÐSVÐX[ÐS[Énð ÐaeÐfiÐknÐfnÑaoó ð6 ð. #ð .°3ð .¸4À¹9ò .ó ð.ð`/¨Ð-?Ñ(@ð /ÀSÈ4ÁZ÷ /r   r   )r1   Útypingr   r   r   Úlitellm._loggingr   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr   Ú&litellm.llms.custom_httpx.http_handlerr	   r
   Úlitellm.types.llms.openair   r   Ú__annotations__r   r   r   r   r   ú<module>rL      sI   ðÜ 	ß ,Ñ ,å 1õ÷ñ
 Ý:ð /4Ð $ eÓ 3ð 26Ð '¨Ó 5÷p/ò p/r   