Ë
    tPêjg  ã                   óö   — U d dl Z d dlmZmZ d dlmZ d dlZd dl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 d d	lmZ d d
lmZ d dlmZmZmZ d dlmZ dZee d<   dZ!ee d<   dZ"ee d<    G d„ de«      Z#y)é    N)ÚAnyÚFinal)Úurlparse)Úverbose_proxy_logger)ÚGuardrailRaisedException)ÚCustomGuardrailÚlog_guardrail_information)ÚLogging)Úget_async_httpx_clientÚhttpxSpecialProvider)ÚGuardrailEventHooks)ÚGuardrailConfigModel)ÚSingulrGuardrailPayloadÚSingulrGuardrailRequestÚSingulrGuardrailResponse)ÚGenericGuardrailAPIInputszhttp://localhost:8003Ú_DEFAULT_API_BASEz/api/v1/ai-gateway/litellmÚ_GUARD_ENDPOINTg      >@Ú_DEFAULT_TIMEOUTc                   ó   ‡ — e Zd Z	 	 	 	 	 	 ddedz  dedz  dedz  d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
deeef   deded	eeef   fd„Zd	eeef   fd„Zdeeef   d	edz  fd„Ze	 ddedededdd	ef
d„«       Zˆ xZS )ÚSingulrGuardrailNÚsingulr_api_keyÚsingulr_api_baseÚsingulr_application_idÚsingulr_guardrail_idÚblock_on_errorÚtimeoutÚkwargsÚreturnc                 óT  •— |xs t         j                  j                  d«      | _        |xs' t         j                  j                  d«      xs t        j                  d«      | _        t        | j                  «      }|j                  dk(  r'|j                  dvrt        d| j                  › d�«      ‚|xs t         j                  j                  d«      | _        |xs t         j                  j                  d	«      | _        |€8t         j                  j                  d
d«      }	|	j                  «       dv | _        n|| _        |€t        n|| _        t#        t$        j&                  ¬«      | _        d|vr#t*        j,                  t*        j.                  g|d<   t1        ‰
| �d  di |¤Ž y )NÚSINGULR_API_KEYÚSINGULR_API_BASEú/Úhttp)Ú	localhostz	127.0.0.1zSingulr: api_base z¬ uses plain HTTP for a non-local endpoint. Guardrail payloads contain the API token, full conversation content, and the guardrail decision, so this endpoint must use HTTPS.ÚSINGULR_ENFORCEMENT_ENTITY_IDÚSINGULR_GUARDRAIL_IDÚSINGULR_BLOCK_ON_ERRORÚtrue)r)   Ú1Úyes)Úllm_providerÚsupported_event_hooks© )ÚosÚenvironÚgetr   r   Úrstripr   r   ÚschemeÚhostnameÚ
ValueErrorr   r   Úlowerr   r   r   r   r   ÚGuardrailCallbackÚasync_handlerr   Úpre_callÚ	post_callÚsuperÚ__init__)Úselfr   r   r   r   r   r   r   ÚparsedÚenvÚ	__class__s             €ú}/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/guardrails/guardrail_hooks/singulr/singulr.pyr<   zSingulrGuardrail.__init__&   sr  ø€ ð  /ÒS´"·*±*·.±.ÐARÓ2SˆÔØ!1Ò!l´R·Z±Z·^±^ÐDVÓ5WÒ!lÔ[l× tÑ tØó!
ˆÔô ! ×!6Ñ!6Ó7ˆØ�=‰=˜FÒ" v§¡ð ?
ñ (
ô Ø$ T×%:Ñ%:Ð$;ð <"ð "óð ð '=Ò&oÄÇ
Á
ÇÁÐOnÓ@oˆÔ#Ø$8Ò$b¼B¿J¹J¿N¹NÐKaÓ<bˆÔ!àÐ!ÜŸ™Ÿ™Ð(@À&ÓIˆCØ"%§)¡)£+Ð1EÐ"EˆDÕà"0ˆDÔà+2¨?Õ'ÀˆŒä3Ü-×?Ñ?ô
ˆÔð #¨&Ñ0ä#×,Ñ,Ü#×-Ñ-ð/ˆFÐ*Ñ+ô
 	‰ÑÑ"˜6Ó"ó    r   c                  ó   — ddl m}  | S )Nr   ©ÚSingulrGuardrailConfigModel)Ú6litellm.types.proxy.guardrails.guardrail_hooks.singulrrE   rD   s    rA   Úget_config_modelz!SingulrGuardrail.get_config_modelW   s   € õ	
ð +Ð*rB   Úrequest_dataÚinputsÚ
input_typec           	      ó   — |s(|j                  dg «      }t        |d|r|d   nd ¬«      }n“|j                  d«      }t        |j                  d«      |j                  d«      |j                  d«      |dk(  r|r|j                  d	¬
«      nd |j                  d«      ¬«      }t        |j                  d«      ||¬«      }|j                  d	¬
«      S )NÚtextsTr   )rJ   Úis_playground_requestÚplayground_textÚresponseÚmodelÚmessagesÚtoolsÚjson)ÚmodeÚlitellm_metadata)rP   rQ   rR   Úmodel_responserU   Úlitellm_call_id)rW   rH   rJ   )r1   r   r   Ú
model_dump)r=   rH   rI   rJ   rL   ÚpayloadrO   Úsingulr_req_objects           rA   Ú_build_payloadzSingulrGuardrail._build_payload_   sÞ   € ñ Ø!Ÿ:™: g¨rÓ2ˆEä-Ø%Ø&*Ù,1  a¢°tô‰Gð +×.Ñ.¨zÓ:ˆHÜ(?Ø"×&Ñ& wÓ/Ø%×)Ñ)¨*Ó5Ø"×&Ñ& wÓ/ØCMÐQ[ÒC[Ñ`h˜x×2Ñ2¸Ð2Ô?ÐnrØ!-×!1Ñ!1Ð2DÓ!Eô)Ðô .Ø ,× 0Ñ 0Ð1BÓ CØ/Ø%ôˆGð ×!Ñ! vÐ!Ó.Ð.rB   c           	      ó†   — t        d„ dd| j                  fd| j                  xs dfd| j                  xs dffD «       «      S )Nc              3   ó.   K  — | ]  \  }}|r||f–— Œ y ­w©Nr.   )Ú.0ÚheaderÚvalues      rA   ú	<genexpr>z2SingulrGuardrail._build_headers.<locals>.<genexpr>   s%   è ø€ ò 
á�˜ñ ð �UŒOñ
ùs   ‚)zContent-Typezapplication/jsonzX-Singulr-Gateway-TokenzX-Singulr-Enforcement-Entity-IdÚ zX-Singulr-Guardrail-Id)Údictr   r   r   )r=   s    rA   Ú_build_headerszSingulrGuardrail._build_headers~   s\   € Üñ 
ð 5Ø*¨D×,@Ñ,@ÐAà5Ø×/Ñ/Ò5°2ðð *¨4×+DÑ+DÒ+JÈÐKð"ô
ó 
ð 	
rB   rY   c              ƒ   óT  K  — | j                   › t        › �}t        j                  d|«       	 | j                  j                  || j                  «       || j                  ¬«      ƒ d {  –—† }|j                  «        t        j                  |j                  «       «      }t        j                  d|«       |S 7 ŒO# t        j                  $ r�}t        j                  d|j                  j                   t#        |«      «       | j$                  rFt'        | j(                  d|j                  j                   › d|j                  j*                  › �¬«      |‚Y d }~y d }~wt        j,                  $ rP}t        j                  dt#        |«      «       | j$                  rt'        | j(                  d	|› �¬«      |‚Y d }~y d }~wt.        t0        j2                  f$ rP}t        j                  d
t#        |«      «       | j$                  rt'        | j(                  d|› �¬«      |‚Y d }~y d }~ww xY w­w)NzSingulr: %s)ÚurlÚheadersrS   r   zSingulr: result=%sz Singulr API returned HTTP %s: %szSingulr API returned HTTP z: )Úguardrail_nameÚmessagezSingulr API unreachable: %sz/Singulr API unreachable (block_on_error=True): z,Singulr API returned an invalid response: %sz*Singulr API returned an invalid response: )r   r   r   Údebugr8   Úpostre   r   Úraise_for_statusr   Úmodel_validaterS   ÚhttpxÚHTTPStatusErrorÚerrorrO   Ústatus_codeÚstrr   r   ri   ÚtextÚTransportErrorr5   ÚpydanticÚValidationError)r=   rY   ÚendpointrO   ÚresultÚexcs         rA   Ú	_call_apizSingulrGuardrail._call_api�   sð  è ø€ Ø!×2Ñ2Ð3´OÐ3DÐEˆÜ×"Ñ" =°(Ô;ð)	Ø$(×$6Ñ$6×$;Ñ$;ØØ×+Ñ+Ó-ØØŸ™ð	 %<ó %÷ ˆHð ×%Ñ%Ô'Ü4×CÑCÀHÇMÁMÃOÓTˆFÜ ×&Ñ&Ð';¸VÔDØˆMðùô ×$Ñ$ò 	Ü ×&Ñ&Ø2Ø—‘×(Ñ(Ü�C“ôð
 ×"Ò"Ü.Ø#'×#6Ñ#6Ø9¸#¿,¹,×:RÑ:RÐ9SÐSUÐVY×VbÑVb×VgÑVgÐUhÐiôð ðô ûä×#Ñ#ò 	Ü ×&Ñ&Ð'DÄcÈ#ÃhÔOØ×"Ò"Ü.Ø#'×#6Ñ#6ØMÈcÈUÐSôð ðô ûäœH×4Ñ4Ð5ò 	Ü ×&Ñ&Ð'UÔWZÐ[^ÓW_Ô`Ø×"Ò"Ü.Ø#'×#6Ñ#6ØHÈÈÐNôð ðô ûð	üsh   ‚+H(®:B: Á(B8Á)AB: Â7H(Â8B: Â:H%ÃBEÅH(ÅH%Å.AF9Æ4H(Æ9H%ÇAH ÈH(È H%È%H(Úlogging_objzLiteLLMLoggingObj | Nonec              ƒ   ó:  K  — | j                  |||«      }|s|S | j                  |«      ƒ d {  –—† }|€|S t        j                  d|j                  |j
                  «       |j                  r)t        | j                  d|j
                  xs d› �d¬«      ‚|S 7 Œj­w)Nz+Singulr: should_block=%s blocking_due_to=%szBlocked by Singulr: ÚunknownT)ri   rj   Úblocked_content)r[   r{   r   rk   Úshould_blockÚblocking_due_tor   ri   )r=   rI   rH   rJ   r|   rY   ry   s          rA   Úapply_guardrailz SingulrGuardrail.apply_guardrail¼   s¨   è ø€ ð ×,Ñ,¨\¸6À:ÓNˆÙØˆMà"Ÿn™n¨WÓ5×5ˆØˆ>ØˆMä×"Ñ"Ø9Ø×ÑØ×"Ñ"ô	
ð ×ÒÜ*Ø#×2Ñ2Ø.¨v×/EÑ/EÒ/RÈÐ.SÐTØ $ôð ð ˆð# 6ús   ‚,B®B¯A+B)NNNNNNr^   )Ú__name__Ú
__module__Ú__qualname__rs   ÚboolÚfloatr   r<   ÚstaticmethodÚtyperG   rd   r   r[   re   r   r{   r	   r‚   Ú__classcell__)r@   s   @rA   r   r   %   sd  ø„ ð '+Ø'+Ø-1Ø+/Ø&*Ø $ñ/#à˜t™ð/#ð  ™*ð/#ð !$ d¡
ð	/#ð
 " D™jð/#ð ˜t™ð/#ð ˜‘ð/#ð ð/#ð 
õ/#ðb ð+˜dÐ#9Ñ:¸TÑAò +ó ð+ð/à˜3 ˜8‘nð/ð *ð/ð ð	/ð
 
ˆc�3ˆh‰ó/ð>
  S¨# X¡ó 
ð- t¨C°¨H¡~ð -Ð:RÐUYÑ:Yó -ð^ ð 37ñà)ðð ðð ð	ð
 0ðð 
#òó ôrB   r   )$r/   Útypingr   r   Úurllib.parser   ro   rv   Úlitellm._loggingr   Úlitellm.exceptionsr   Ú%litellm.integrations.custom_guardrailr   r	   Ú*litellm.litellm_core_utils.litellm_loggingr
   ÚLiteLLMLoggingObjÚ&litellm.llms.custom_httpx.http_handlerr   r   Úlitellm.types.guardrailsr   Ú3litellm.types.proxy.guardrails.guardrail_hooks.baser   rF   r   r   r   Úlitellm.types.utilsr   r   Ú__annotations__r   r   r   r.   rB   rA   ú<module>r—      sp   ðÜ 	ß Ý !ã Û å 1Ý 7÷õ÷õ 9õ÷ñ õ
 :à2Ð �5Ó 2Ø5€�Ó 5ØÐ �%Ó ôt�õ trB   