Ë
    tPêj‡V  ã                   ó~  — U d Z ddlZddlZddlmZ ddlmZmZmZmZm	Z	 ddl
m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mZ ddlmZ ddlmZmZmZ erddlmZ  ddl!m"Z" de#de#fd„Z$dZ%ee&d<   dZ'ee&d<   dZ(ee&d<   dZ)ee&d<   dZ*ee&d<   dZ+ee&d<   dZ,ee&d<   g d ¢Z-ee&d!<    G d"„ d#e.«      Z/ G d$„ d%e«      Z0y)&a¥  
XecGuard guardrail integration for LiteLLM.

Calls the CyCraft XecGuard API (https://api-xecguard.cycraft.ai)
to scan the full conversation history against configured policies
(prompt-injection, PII, harmful-content, custom rules) and, when
grounding documents are supplied via request metadata, also validates
the assistant response against those reference documents via the
/grounding endpoint.

Design notes (intentional divergences from the framework defaults):
  * The full conversation history (system + user + assistant) is always
    forwarded to XecGuard regardless of ``scan_type``. This bypasses the
    framework's optional ``skip_system_message_in_guardrail`` behaviour
    on purpose - policy enforcement depends on system-prompt visibility.
  * ``apply_guardrail`` is defined directly on this class so the
    ``during_call`` dispatch (proxy/utils.py checks for the method on
    ``type(callback).__dict__``) reaches our implementation.
  * ``async_logging_hook`` is overridden because the framework calls it
    directly for ``logging_only`` mode - it does NOT bridge to
    ``apply_guardrail``. Our override runs the scan non-blockingly and
    swallows every exception.
é    N)Údatetime)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚOptional)ÚHTTPException)Úverbose_proxy_logger)ÚCustomGuardrailÚlog_guardrail_information)Ú"redact_nested_match_and_regex_keys)Úmask_credentials_in_payload)Úget_async_httpx_clientÚhttpxSpecialProvider)ÚGuardrailEventHooks)ÚGenericGuardrailAPIInputsÚGuardrailStatusÚ#StandardLoggingGuardrailInformation)ÚLogging)ÚGuardrailConfigModelÚscan_resultÚreturnc                 óØ   — | j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}t        |«      }t        t        |t        «      r|n|«      }t        |t        «      r|S |S c c}}w )NÚsecret_fields)Úitemsr   r   Ú
isinstanceÚdict)r   ÚkeyÚvalueÚwithout_secretsÚredactedÚmaskeds         ú/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/guardrails/guardrail_hooks/xecguard/xecguard.pyÚ!_sanitize_scan_result_for_loggingr$   ;   sj   € Ø;F×;LÑ;LÓ;N×i©Z¨S°%ÐRUÐYhÓRh˜c 5™jÐi€OÑiÜ8¸ÓI€HÜ/¼JÀxÔQUÔ<V±Ð\kÓl€FÜ ¬Ô-ˆ6ÐB°?ÐBùó js
   ”A&¢A&zhttps://api-xecguard.cycraft.aiÚ_DEFAULT_API_BASEz/xecguard/v1/scanÚ_SCAN_ENDPOINTz/xecguard/v1/groundingÚ_GROUNDING_ENDPOINTÚxecguard_v2Ú_DEFAULT_MODELÚBALANCEDÚ_DEFAULT_GROUNDING_STRICTNESSÚxecguard_grounding_documentsÚ_METADATA_GROUNDING_KEYéÈ   Ú_RATIONALE_TRUNCATE_CHARS)Ú&Default_Policy_SystemPromptEnforcementÚ'Default_Policy_HarmfulContentProtectionÚ,Default_Policy_GeneralPromptAttackProtectionÚ_DEFAULT_POLICIESc                   ó   — e Zd Zy)ÚXecGuardMissingCredentialsN)Ú__name__Ú
__module__Ú__qualname__© ó    r#   r5   r5   P   s   „ Ør:   r5   c                   óÐ  ‡ — e Zd Z	 	 	 	 	 	 d1dedz  dedz  dedz  dee   dz  dedz  dedz  ded	dfˆ fd
„Zed	e	d   dz  fd„«       Z
ed	ee   fd„«       Ze	 d2dededed   ded   d	ef
d„«       Zdededed	eeef   fd„Zdededed	eeef   fd„Z	 d3dee   deded	edz  fd„Zdee   dee   d	edz  fd„Z	 d3ded eded	edz  fd!„Zdededed	ee   fd"„Zed#ed	efd$„«       Zeded	edz  fd%„«       Zedee   d&ed	edz  fd'„«       Zed(ed	edz  fd)„«       Zed*ed	efd+„«       Zed,ed	edz  fd-„«       Z eded	ee   fd.„«       Z!eded	efd/„«       Z"eded	efd0„«       Z#ˆ xZ$S )4ÚXecGuardGuardrailNÚapi_keyÚapi_baseÚxecguard_modelÚpolicy_namesÚblock_on_errorÚgrounding_strictnessÚkwargsr   c                 ó|  •— |xs t         j                  j                  d«      | _        | j                  st	        d«      ‚|xs' t         j                  j                  d«      xs t
        j                  d«      | _        |xs t        | _	        || _
        |€8t         j                  j                  dd«      }|j                  «       dv | _        n|| _        |xs t        | _        t        t         j"                  ¬«      | _        |j'                  d	t)        | j+                  «       «      «       t-        ‰	| �\  d
i |¤Ž y )NÚXECGUARD_API_KEYznXecGuard API key is required. Set XECGUARD_API_KEY in the environment or pass api_key in the guardrail config.ÚXECGUARD_API_BASEú/ÚXECGUARD_BLOCK_ON_ERRORÚtrue)rI   Ú1Úyes)Úllm_providerÚsupported_event_hooksr9   )ÚosÚenvironÚgetr=   r5   r%   Úrstripr>   r)   r?   r@   ÚlowerrA   r+   rB   r   r   ÚGuardrailCallbackÚasync_handlerÚ
setdefaultÚlistÚget_supported_event_hooksÚsuperÚ__init__)
Úselfr=   r>   r?   r@   rA   rB   rC   ÚenvÚ	__class__s
            €r#   rY   zXecGuardGuardrail.__init__U   s  ø€ ð ÒD¤"§*¡*§.¡.Ð1CÓ"DˆŒØ�|Š|Ü,ð(óð ð "Ò]¤R§Z¡Z§^¡^Ð4GÓ%HÒ]ÔL]×eÑeÐfiÓjˆŒà,Ò>´ˆÔØ(ˆÔàÐ!ÜŸ™Ÿ™Ð(AÀ6ÓJˆCØ"%§)¡)£+ð 2ð #ˆDÕð #1ˆDÔà$8Ò$YÔ<YˆÔ!ä3Ü-×?Ñ?ô
ˆÔð 	×ÑÐ1´4¸×8VÑ8VÓ8XÓ3YÔZä‰ÑÑ"˜6Ó"r:   r   c                  ó   — ddl m}  | S )Nr   ©ÚXecGuardConfigModel)Ú7litellm.types.proxy.guardrails.guardrail_hooks.xecguardr_   r^   s    r#   Úget_config_modelz"XecGuardGuardrail.get_config_model�   s   € õ	
ð #Ð"r:   c                 ó~   — t         j                  t         j                  t         j                  t         j                  gS ©N)r   Úpre_callÚduring_callÚ	post_callÚlogging_only)Úclss    r#   rW   z+XecGuardGuardrail.get_supported_event_hooks‰   s2   € ô  ×(Ñ(Ü×+Ñ+Ü×)Ñ)Ü×,Ñ,ð	
ð 	
r:   ÚinputsÚrequest_dataÚ
input_type)ÚrequestÚresponseÚlogging_objÚLiteLLMLoggingObjc              ƒ   ó  K  — | j                  |||¬«      }|s|S |dk(  rdnd}| j                  ||¬«      ƒ d {  –—† }|€|S |j                  d«      dk(  r.t        d| j	                  |«      | j
                  xs d	|d
œ¬«      ‚|dk(  rr| j                  |«      }|r_| j                  ||¬«      ƒ d {  –—† }	|	�B|	j                  d«      dk(  r.t        d| j                  |	«      | j
                  xs d	|	d
œ¬«      ‚|S 7 ŒÃ7 ŒL­w)N©rj   ri   rk   rl   Úinputrm   )ÚmessagesÚ	scan_typeÚdecisionÚUNSAFEé�  Úxecguard)ÚerrorÚguardrail_nameÚxecguard_response©Ústatus_codeÚdetail)rs   Ú	documents)	Ú_build_full_historyÚ
_call_scanrP   r	   Ú_format_scan_block_messagerz   Ú_extract_grounding_documentsÚ_call_groundingÚ_format_grounding_block_message)
rZ   ri   rj   rk   rn   rs   rt   r   r   Úgrounding_results
             r#   Úapply_guardrailz!XecGuardGuardrail.apply_guardrail’   sG  è ø€ ð ×2Ñ2Ø%ØØ!ð 3ó 
ˆñ
 ØˆMà&0°IÒ&=™7À:ˆ	Ø#'§?¡?¸HÐPY ?Ó#Z×ZˆØÐØˆMà�?‰?˜:Ó&¨(Ò2ÜØà!×<Ñ<¸[ÓIØ&*×&9Ñ&9Ò&G¸ZØ)4ñôð ð ˜Ò#Ø#×@Ñ@ÀÓNˆIÙØ04×0DÑ0DØ%Ø'ð 1Eó 1÷ +Ð ð $Ð/Ð4D×4HÑ4HÈÓ4TÐX`Ò4`Ü'Ø$'à%)×%IÑ%IÐJZÓ%[Ø.2×.AÑ.AÒ.OÀZØ1Añ ôð ð ˆð? [øð"+ús#   ‚8DºC>»A8DÂ3D Â4ADÄ DÚresultÚ	call_typec           
   ƒ   óš  K  — t        |t        «      r$d|v r d|d   v rd|d   d   v r|d   d   d   r||fS t        j                  «       }	 | j	                  |«      }i |¥}|�||d<   | j                  |i d¬«      }d}n| j                  |i d¬«      }d}|s||fS | j                  ||d	¬
«      ƒ d{  –—† }	|	€||fS |	j                  d«      dk(  rdnd}
t        j                  «       }t        | j                  xs dt        j                  t        |	«      |
|j                  «       |j                  «       ||z
  j                  «       d¬«      }|d   j                  d«      }t        |t        «      r|j!                  |«       n	|g|d   d<   ||fS 7 ŒÞ# t"        $ r,}t%        j&                  dt)        |«      «       Y d}~||fS d}~ww xY w­w)a   Observe-only scan for logging_only mode.

        Never blocks, never raises - all errors are swallowed. Records a
        StandardLoggingGuardrailInformation entry so the scan decision
        reaches downstream loggers (Langfuse, DataDog, etc.).
        Úlitellm_paramsÚmetadataÚ&standard_logging_guardrail_informationNrm   rq   rl   rr   T)rs   rt   Úsuppress_errorsru   rv   Úguardrail_intervenedÚsuccessrx   )rz   Úguardrail_modeÚguardrail_responseÚguardrail_statusÚ
start_timeÚend_timeÚdurationÚmasked_entity_countÚstandard_logging_objectÚguardrail_informationz-XecGuard logging_only swallowed exception: %s)r   r   r   ÚnowÚ%_extract_assistant_text_from_responser€   r�   rP   r   rz   r   rg   r$   Ú	timestampÚtotal_secondsrV   ÚappendÚ	Exceptionr
   ÚdebugÚstr)rZ   rC   rˆ   r‰   r”   Úassistant_textrj   rs   rt   r   r“   r•   ÚslgÚexistingÚexcs                  r#   Úasync_logging_hookz$XecGuardGuardrail.async_logging_hookÄ   s.  è ø€ ô �vœtÔ$Ø  FÑ*Ø˜fÐ%5Ñ6Ñ6Ø8¸FÐCSÑ<TÐU_Ñ<`Ñ`ØÐ'Ñ(¨Ñ4Ð5]Ò^à˜6�>Ð!ä$ŸL™L›Nˆ
ð6	Ø$(×$NÑ$NÈvÓ$VˆNØ", V *ˆLØÐ)Ø+1�˜ZÑ(Ø×3Ñ3Ø!-ØØ)ð 4ó �ð
 '‘	à×3Ñ3Ø!-ØØ(ð 4ó �ð
 $�	áØ˜v�~Ð%à'+§¡Ø!Ø#Ø $ð (7ó (÷ "ˆKð
 Ð"Ø˜v�~Ð%ð +6¯/©/¸*Ó*EÈÒ*QÑ&ÐW`ð ô 'Ÿl™l›nˆHÜ<Ø#×2Ñ2Ò@°jÜ2×?Ñ?Ü#DÀ[Ó#QØ!1Ø%×/Ñ/Ó1Ø!×+Ñ+Ó-Ø" ZÑ/×>Ñ>Ó@Ø$(ô	ˆCð %Ð%>Ñ?×CÑCÐD[Ó\ˆHÜ˜(¤DÔ)Ø—‘ Õ$àNQÈU�Ð0Ñ1Ð2IÑJð �vˆ~ÐðC"ùô8 ò 	Ü ×&Ñ&Ø?Ü�C“÷ð ð �vˆ~Ðûð	üs\   ‚A	GÁAF ÂGÂF Â2FÂ3	F Â<GÂ=CF ÆGÆF Æ	GÆGÆ;GÇGÇGc                 ó„  — 	 	 t        j                  «       }|j                  «       r||fS |j                  | j                  |||¬«      «       ||fS # t        $ r, t        j                  «       }t        j                  |«       Y Œow xY w# t        $ r,}t        j                  dt        |«      «       Y d}~||fS d}~ww xY w)zåSync counterpart to ``async_logging_hook``.

        Runs the async version on an available loop, swallowing every
        exception. Mirrors the pattern used by the Presidio guardrail
        for sync logging callbacks.
        )rC   rˆ   r‰   z2XecGuard sync logging_hook swallowed exception: %sN)ÚasyncioÚget_event_loopÚRuntimeErrorÚnew_event_loopÚset_event_loopÚ
is_runningÚrun_until_completer¦   rŸ   r
   r    r¡   )rZ   rC   rˆ   r‰   Úloopr¥   s         r#   Úlogging_hookzXecGuardGuardrail.logging_hook  sÅ   € ð	ð-Ü×-Ñ-Ó/�ð �‰Ô Ø˜v�~Ð%Ø×#Ñ# D×$;Ñ$;À6ÐRXÐdmÐ$;Ó$nÔoð �vˆ~Ðøô  ò -Ü×-Ñ-Ó/�Ü×&Ñ& tÖ,ð-ûô ò 	Ü ×&Ñ&ØDÜ�C“÷ð ð �vˆ~Ðûð	ús9   ƒA —B
 «#B
 Á2BÂB
 ÂBÂB
 Â
	B?ÂB:Â:B?rs   rt   rŽ   c              ƒ   ó¨   K  — | j                   ||| j                  r| j                  nt        dœ}| j                  t        ||¬«      ƒ d {  –—† S 7 Œ­w)N)Úmodelrt   rs   r@   )ÚpathÚpayloadrŽ   )r?   r@   r3   Ú_postr&   )rZ   rs   rt   rŽ   r´   s        r#   r�   zXecGuardGuardrail._call_scan3  s]   è ø€ ð ×(Ñ(Ø"Ø Ø26×2CÒ2C˜T×.Ò.ÔIZñ	*
ˆð —Z‘ZÜØØ+ð  ó 
÷ 
ð 	
ð 
ús   ‚A	AÁAÁAr   c              ƒ   óÖ   K  — | j                  |d«      }| j                  |d«      }|�|€y | j                  |||| j                  dœ}| j                  t        |¬«      ƒ d {  –—† S 7 Œ­w)NÚuserÚ	assistant)r²   Úpromptrm   r   Ú
strictness)r³   r´   )Ú_extract_last_text_by_roler?   rB   rµ   r'   )rZ   rs   r   r¹   Úresponse_textr´   s         r#   r„   z!XecGuardGuardrail._call_groundingE  sw   è ø€ ð
 ×7Ñ7¸À&ÓIˆØ#×>Ñ>¸xÈÓUˆØˆ>˜]Ð2Øà×(Ñ(ØØ%Ø"Ø×3Ñ3ñ
ˆð —Z‘ZÔ%8À'�ZÓJ×JÐJÐJús   ‚A A)Á"A'Á#A)r³   r´   c              ƒ   ó  K  — | j                   › |› �}t        j                  d|t        |j	                  «       «      «       	 | j
                  j                  |d| j                  › �ddœ|d¬«      ƒ d {  –—† }|j                  «        |j                  «       S 7 Œ$# t        $ r^}t        j                  dt        |«      «       |rY d }~y | j                  r"t        dd	|› �| j                  xs d
dœ¬«      |‚Y d }~y d }~ww xY w­w)Nz!XecGuard: POST %s payload_keys=%szBearer zapplication/json)ÚAuthorizationzContent-Typeg      $@)ÚurlÚheadersÚjsonÚtimeoutzXecGuard API error: %srw   z0XecGuard API unreachable (block_on_error=True): rx   )ry   rz   r|   )r>   r
   r    rV   ÚkeysrT   Úpostr=   Úraise_for_statusrÁ   rŸ   ry   r¡   rA   r	   rz   )rZ   r³   r´   rŽ   Úendpointrm   r¥   s          r#   rµ   zXecGuardGuardrail._postW  s  è ø€ ð "Ÿ]™]˜O¨D¨6Ð2ˆÜ×"Ñ"Ø/ØÜ�—‘“Ó ô	
ð
	Ø$(×$6Ñ$6×$;Ñ$;Øà'.¨t¯|©|¨nÐ%=Ø$6ñð Øð %<ó %÷ ˆHð ×%Ñ%Ô'Ø—=‘=“?Ð"ðùô ò 	Ü ×&Ñ&Ð'?ÄÀSÃÔJÙÜØ×"Ò"Ü#Ø #à$TÐUXÐTYÐ"ZØ*.×*=Ñ*=Ò*KÀñôð ðô ûð	üsM   ‚?DÁ2B Á4BÁ5#B ÂDÂB Â	DÂ$!C=ÃDÃ
.C=Ã8DÃ=DÄDc                 ó˜  — |j                  d«      xs g }|D �cg c]$  }t        |t        «      sŒ| j                  |«      ‘Œ& }}|dk(  rC|sg S |d   j                  d«      dk7  r&| j	                  |«      }|€g S |j                  |«       |S | j                  |j                  d«      «      }|€g S |j                  d|dœ«       |S c c}w )	aN  Assemble the full message list that will be sent to XecGuard.

        Always reads from ``request_data['messages']`` so the framework's
        optional ``skip_system_message_in_guardrail`` filter cannot strip
        system prompts. Synthesises a trailing user/assistant message when
        the request data is incomplete.
        rs   rl   éÿÿÿÿÚroler·   rm   r¸   ©rÉ   Úcontent)rP   r   r   Ú_normalize_messageÚ_synthesize_user_from_inputsrž   r›   )	rZ   rj   ri   rk   Úraw_messagesÚmrs   Úsynthesizedr¢   s	            r#   r€   z%XecGuardGuardrail._build_full_history�  sÛ   € ð +×.Ñ.¨zÓ:Ò@¸bˆØKWÖ&oÀaÔ[eÐfgÔimÕ[n t×'>Ñ'>¸qÕ'AÐ&oˆÐ&oà˜Ò"ÙØ�	Ø˜‰|×Ñ Ó'¨6Ò1Ø%)×%FÑ%FÀvÓ%N�ØÐ&Ø�IØ—‘ Ô,ØˆOð !%× JÑ JÈ<×K[ÑK[Ð\fÓKgÓ hˆØÐ!ØˆIØ�‰ ¸ÑHÔIØˆùò# 'ps
   šC°CÚmessagec                 óŽ  — | j                  d«      xs d}| j                  d«      }t        |t        «      r||dœS t        |t        «      rvg }|D ][  }t        |t        «      sŒ|j                  d«      dk(  sŒ)|j                  d«      }t        |t        «      sŒK|j                  |«       Œ] |dj                  |«      dœS |ddœS )	z:Flatten multimodal content to a plain string for XecGuard.rÉ   r·   rË   rÊ   ÚtypeÚtextú
Ú )rP   r   r¡   rV   r   rž   Újoin)rÑ   rÉ   rË   ÚpartsÚitemrÔ   s         r#   rÌ   z$XecGuardGuardrail._normalize_message¢  s·   € ð —k‘k &Ó)Ò3¨VˆØ Ÿ™ YÓ/ˆÜ�gœsÔ#Ø ¨WÑ5Ð5Ü�gœtÔ$Ø&(ˆEØò +�Ü˜d¤DÕ)¨d¯h©h°vÓ.>À&Ó.HØŸ8™8 FÓ+�DÜ! $¬Õ,ØŸ™ TÕ*ð	+ð
 !¨T¯Y©Y°uÓ-=Ñ>Ð>Ø¨Ñ,Ð,r:   c                 óŒ   — t        | t        «      sy | j                  d«      }|sy dj                  d„ |D «       «      }|sy d|dœS )NÚtextsrÕ   c              3   óH   K  — | ]  }t        |t        «      sŒ|sŒ|–— Œ y ­wrc   )r   r¡   )Ú.0Úts     r#   ú	<genexpr>zAXecGuardGuardrail._synthesize_user_from_inputs.<locals>.<genexpr>º  s   è ø€ Ò!O¨´jÀÄCÕ6HÊQ¤!Ñ!Oùs   ‚"˜"›"r·   rÊ   )r   r   rP   r×   )ri   rÛ   Újoineds      r#   rÍ   z.XecGuardGuardrail._synthesize_user_from_inputs³  sH   € ä˜&¤$Ô'ØØ—z‘z 'Ó*ˆÙØØŸ	™	Ñ!O¨UÔ!OÓOˆÙØØ¨6Ñ2Ð2r:   rÉ   c                 óž   — t        | «      D ]?  }|j                  d«      |k(  sŒ|j                  d«      }t        |t        «      r|r|c S  y  y )NrÉ   rË   )ÚreversedrP   r   r¡   )rs   rÉ   rÑ   rË   s       r#   r»   z,XecGuardGuardrail._extract_last_text_by_role¿  sN   € ä Ó)ò 	ˆGØ�{‰{˜6Ó" dÓ*Ø!Ÿ+™+ iÓ0�Ü˜g¤sÔ+±Ø"’NÙð	ð r:   rm   c                 ó>  — | €y d }t        | d«      r| j                  }n!t        | t        «      r| j	                  d«      }|sy g }|D ]@  }t
        j                  |«      }t
        j                  |«      }|sŒ0|j                  |«       ŒB dj                  |«      xs d S )NÚchoicesrÕ   )
Úhasattrrä   r   r   rP   r<   Ú_extract_choice_contentÚ_content_to_textrž   r×   )rm   rä   Ú
text_partsÚchoicerË   rÔ   s         r#   r›   z7XecGuardGuardrail._extract_assistant_text_from_responseÉ  sž   € àÐØØˆÜ�8˜YÔ'Ø×&Ñ&‰GÜ˜¤$Ô'Ø—l‘l 9Ó-ˆGÙØØ')ˆ
Øò 	(ˆFÜ'×?Ñ?ÀÓGˆGÜ$×5Ñ5°gÓ>ˆDÚØ×!Ñ! $Õ'ð		(ð
 �y‰y˜Ó$Ò,¨Ð,r:   ré   c                 óô   — t        | d«      r| j                  }n#t        | t        «      r| j	                  d«      }ny |€y t        |d«      r|j
                  S t        |t        «      r|j	                  d«      S y )NrÑ   rË   )rå   rÑ   r   r   rP   rË   )ré   rÑ   s     r#   ræ   z)XecGuardGuardrail._extract_choice_contentÜ  sh   € ä�6˜9Ô%Ø—n‘n‰GÜ˜¤Ô%Ø—j‘j Ó+‰GàØˆ?ØÜ�7˜IÔ&Ø—?‘?Ð"Ü�gœtÔ$Ø—;‘;˜yÓ)Ð)Ør:   rË   c                 óT  — t        | t        «      r| r| S t        | t        «      r| D �cg c]V  }t        |t        «      rD|j	                  d«      dk(  r0t        |j	                  d«      t        «      r|j	                  d«      ‘ŒX }}dj                  d„ |D «       «      }|xs d S y c c}w )NrÓ   rÔ   rÕ   c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­wrc   r9   )rÝ   Úps     r#   rß   z5XecGuardGuardrail._content_to_text.<locals>.<genexpr>ö  s   è ø€ Ò%<¨Aº!¤aÑ%<ùs   ‚Š)r   r¡   rV   r   rP   r×   )rË   rÙ   rØ   rà   s       r#   rç   z"XecGuardGuardrail._content_to_textì  sž   € ä�gœsÔ#©ØˆNÜ�gœtÔ$ð $öàÜ˜d¤DÔ)¨d¯h©h°vÓ.>À&Ò.HÌZÐX\×X`ÑX`ÐagÓXhÔjmÔMnð —‘˜Õ ðˆEð ð
 !ŸI™IÑ%<°Ô%<Ó<ˆFØ’>˜TÐ!Øùòs   ©AB%c                 óÔ  — | j                  d«      xs | j                  d«      }t        |t        «      sg S |j                  t        «      }t        |t        «      r|sg S g }|D ]�  }t        |t        «      rYt        |j                  d«      t
        «      r:t        |j                  d«      t
        «      r|j                  |d   |d   dœ«       Œlt        j                  d|«       Œƒ |S )NrŒ   Úlitellm_metadataÚdocument_idÚcontext)rð   rñ   z3XecGuard: dropping malformed grounding document: %r)	rP   r   r   r-   rV   r¡   rž   r
   r    )rj   rŒ   Úraw_docsÚ
valid_docsÚdocs        r#   rƒ   z.XecGuardGuardrail._extract_grounding_documentsþ  sÖ   € à&×*Ñ*¨:Ó6Ò^¸,×:JÑ:JÐK]Ó:^ˆÜ˜(¤DÔ)ØˆIØ"Ÿ,™,Ô'>Ó?ˆÜ˜(¤DÔ)±ØˆIØ(*ˆ
Øò 	ˆCä˜3¤Ô%Ü˜sŸw™w }Ó5´sÔ;Ü˜sŸw™w yÓ1´3Ô7à×!Ñ!à'*¨=Ñ'9Ø#& y¡>ñõô %×*Ñ*ØIØõð	ð" Ðr:   c                 óè  — | j                  dd«      }| j                  d«      }t        |t        «      sg }g }|D ]N  }t        |t        «      sŒ|j                  d«      }t        |t        «      sŒ6|sŒ9||vsŒ>|j                  |«       ŒP |rdj                  |«      nd}d}|D ]B  }t        |t        «      sŒ|j                  d«      }t        |t        «      sŒ6|sŒ9|d t         } n d|› d	|› d
|› �S )NÚtrace_idrÖ   Úxecguard_resultÚviolated_policy_nameú,ÚunknownÚ	rationalezBlocked by XecGuard: policies=[ú] trace_id=ú rationale=)rP   r   rV   r   r¡   rž   r×   r/   )	rˆ   rö   Ú
violationsÚseenÚvÚnameÚpoliciesrû   Ú	candidates	            r#   r‚   z,XecGuardGuardrail._format_scan_block_message  sø   € à Ÿ*™* Z°Ó4ˆØ—Z‘ZÐ 1Ó2ˆ
Ü˜*¤dÔ+ØˆJØ!#ˆØò 	"ˆAÜ˜a¤Ô&ØØ—5‘5Ð/Ó0ˆDÜ˜$¤Õ$ª°$¸dÒ2BØ—‘˜DÕ!ð	"ñ -1˜#Ÿ(™( 4œ.°iˆØˆ	Øò 	ˆAÜ˜!œTÕ"ØŸE™E +Ó.�	Ü˜i¬Õ-²)Ø )Ð*DÔ+DÐ E�IÙð	ð 1°°
¸+ÀhÀZÈ{Ð[dÐZeÐfÐfr:   c                 ó�  — | j                  dd«      }| j                  d«      }g }d}t        |t        «      rk|j                  d«      }t        |t        «      r |D �cg c]  }t        |t        «      sŒ|‘Œ }}|j                  d«      }t        |t        «      r	|d t
         }|rdj                  |«      nd}d|› d	|› d
|› �S c c}w )Nrö   rÖ   r÷   Úviolated_rules_listrû   rù   rú   z&Blocked by XecGuard grounding: rules=[rü   rý   )rP   r   r   rV   r¡   r/   r×   )	rˆ   rö   r~   Úrulesrû   Ú	raw_rulesÚrr  Ú	rules_strs	            r#   r…   z1XecGuardGuardrail._format_grounding_block_message5  sÃ   € à Ÿ*™* Z°Ó4ˆØŸ
™
Ð#4Ó5ˆØˆØˆ	Ü�fœdÔ#Ø%Ÿz™zÐ*?Ó@ˆIÜ˜)¤TÔ*Ø$-ÖD˜q´¸A¼sÕ1CšÐD�ÐDØ%Ÿz™z¨+Ó6ˆIÜ˜)¤SÔ)Ø%Ð&@Ô'@ÐA�	Ù.3˜3Ÿ8™8 Eœ?¸ˆ	Ø7¸	°{À+ÈhÈZÐWbÐclÐbmÐnÐnùò Es   ÁCÁ3C)NNNNNNrc   )F)%r6   r7   r8   r¡   rV   Úboolr   rY   ÚstaticmethodrÓ   ra   Úclassmethodr   rW   r   r   r   r   r   r‡   Útupler¦   r°   r�   r„   rµ   r€   rÌ   rÍ   r»   r›   ræ   rç   rƒ   r‚   r…   Ú__classcell__)r\   s   @r#   r<   r<   T   s»  ø„ ð #Ø#Ø%)Ø)-Ø&*Ø+/ñ*#à�t‘ð*#ð ˜‘*ð*#ð ˜d™
ð	*#ð
 ˜3‘i $Ñ&ð*#ð ˜t™ð*#ð " D™jð*#ð ð*#ð 
õ*#ðX ð#˜dÐ#9Ñ:¸TÑAò #ó ð#ð ð
¨$Ð/BÑ*Cò 
ó ð
ð ð 6:ñ/à)ð/ð ð/ð Ð1Ñ2ð	/ð
 Ð1Ñ2ð/ð 
#ò/ó ð/ðbMàðMð ðMð ð	Mð
 
ˆt�SˆyÑ	óMð^àðð ðð ð	ð
 
ˆt�SˆyÑ	óðH !&ñ	
à�t‘*ð
ð ð
ð ð	
ð
 
�‰ó
ð$Kà�t‘*ðKð ˜‘:ðKð 
�‰ó	Kð, !&ñ	$àð$ð ð$ð ð	$ð
 
�‰ó$ðTàðð ðð ð	ð
 
ˆd‰óðB ð- Dð -¨Tò -ó ð-ð  ð	3¨Sð 	3°T¸D±[ò 	3ó ð	3ð ð¨T°$©Zð ¸sð ÀsÈTÁzò ó ðð ð-¸ð -ÀÀdÁ
ò -ó ð-ð$ ð¨ð °ò ó ðð ð #ð ¨#°©*ò ó ðð" ð°4ð ¸DÀ¹Jò ó ðð> ðg¨4ð g°Cò gó ðgð, ðo°ð o¸ò oó ôor:   r<   )1Ú__doc__r¨   rN   r   Útypingr   r   r   r   r   Úfastapi.exceptionsr	   Úlitellm._loggingr
   Ú%litellm.integrations.custom_guardrailr   r   Ú'litellm.litellm_core_utils.core_helpersr   Ú0litellm.litellm_core_utils.sensitive_data_maskerr   Ú&litellm.llms.custom_httpx.http_handlerr   r   Úlitellm.types.guardrailsr   Úlitellm.types.utilsr   r   r   Ú*litellm.litellm_core_utils.litellm_loggingr   ro   Ú3litellm.types.proxy.guardrails.guardrail_hooks.baser   r   r$   r%   Ú__annotations__r&   r'   r)   r+   r-   r/   r3   rŸ   r5   r<   r9   r:   r#   ú<module>r     sà   ðòó0 Û 	Ý ß ?Õ ?å ,å 1÷õ WÝ X÷õ 9÷ñ ñ õõð
C°4ð C¸Dó Cð =Ð �5Ó <Ø+€�Ó +Ø5Ð �UÓ 5Ø%€�Ó %Ø'1Ð ˜uÓ 1Ø!?Ð ˜Ó ?Ø#&Ð ˜5Ó &òÐ �5ó ô	 ô 	ôoo˜õ oor:   