
    ^h|1                        S SK r S SKr\R                  R                  S \ R                  R	                  S5      5        S SKrS SKrS SKJrJrJ	r	J
r
Jr  S SKrS SKJr  S SKrS SKJr  S SKJr  S SKJrJr  S SKJr  S S	KJr  S S
KJr  S SKJrJrJ r J!r!  Sr"\ RF                  RH                  S \ RJ                  RH                  S\ RL                  RH                  S0r' " S S\5      r(g)    Nz../..)DictListLiteralOptionalUnion)HTTPException)verbose_proxy_logger)CustomGuardrail)get_async_httpx_clienthttpxSpecialProvider)UserAPIKeyAuth) should_proceed_based_on_metadata)
get_secret)GuardrailItemLakeraCategoryThresholdsRoledefault_roleslakera_prompt_injection      c                      ^  \ rS rSr    SS\S   S\\   S\\   S\\   4U 4S jjjrS	\	S
S4S jr
S\	S\S\S   4S jrS\S\R                  S\S\S   S
\\\\\4      4
S jrS\	S\S\S   4S jrSrU =r$ )lakeraAI_Moderation/   Nmoderation_check)pre_callin_parallelcategory_thresholdsapi_baseapi_keyc                    > [        [        R                  S9U l        U=(       d    [        R
                  S   U l        Xl        X l        U=(       d    [        S5      =(       d    SU l
        [        TU ]0  " S0 UD6  g )N)llm_providerLAKERA_API_KEYLAKERA_API_BASEzhttps://api.lakera.ai )r   r   GuardrailCallbackasync_handlerosenvironlakera_api_keyr   r   r   r   super__init__)selfr   r   r   r   kwargs	__class__s         l/home/james-whalen/.local/lib/python3.13/site-packages/litellm/proxy/guardrails/guardrail_hooks/lakera_ai.pyr+   lakeraAI_Moderation.__init__0   sm     4-??
 &E4D)E 0#6 P
#45P9P 	 	"6"    responsereturnc                    UR                  S/ 5      n[        U5      S::  a  g US   R                  SS5      nUS   R                  SS 5      nU R                  b  Ub}  [        S0 UD6nSU;   a3  SU R                  ;   a#  US   U R                  S   :  a  [	        SSUS	.S
9eSU;   a3  SU R                  ;   a#  US   U R                  S   :  a  [	        SSUS	.S
9eg USL a  [	        SSUS	.S
9eg )Nresultsr   flaggedFcategory_scores	jailbreaki  zViolated jailbreak threshold)errorlakera_ai_response)status_codedetailprompt_injectionz#Violated prompt_injection thresholdTzViolated content safety policyr$   )getlenr   r   r   )r,   r2   _resultsr6   r7   typed_cat_scoress         r/   _check_response_flagged+lakeraAI_Moderation._check_response_flaggedD   s@   <<	2.x=A1+//)U3*21+//:KT*R##/*#;#No#N #33#t'?'?? )533K@A ,(+)G6>$  '*::*d.F.FF ));<334FGH ,(+)N6>$    _=*2  r1   datauser_api_key_dict	call_type)
completiontext_completion
embeddingsimage_generation
moderationaudio_transcriptionpass_through_endpointrerankc                 0  #    [        U[        S9I S h  vN SL a  g SnSnSU;   Gas  [        US   [        5      (       GaZ  [        R
                  R                  S5      nUb  UR                  nOS nUc  [        n/ nUbc  U H]  n	[        U	[        5      (       a  UR                  U	R                  5        M5  [        U	[        5      (       d  ML  UR                  U	5        M_     [        R                  5        V	s0 s H  oS _M     n
n	S n/ nUS    Hb  nUR                  S5      n	X;   d  M  SU;   a	  / UQUS   QnU	[        R                  R                  :X  a  UnML  U	UR                  S5      S	.X'   Md     Ub  [        R                   (       d  UR                  S5      n/ nU H"  nS
U;   d  M  UR                  US
   S   5        M$     [#        U5      S:  a  USSR%                  U5      -   -  n[        R                  R                  US	.U
[        R                  R                  '   ['        U
R)                  5       S S9 VVs/ s H  u  nnUc  M  UPM     nnn[#        U5      S:X  a  [*        R,                  " S5        g SU0n[.        R0                  " U5      nOSU;   a6  [        US   [        5      (       a  US   n[.        R0                  " SU05      nOJSU;   aD  [        US   [        5      (       a,  SR%                  US   5      n[.        R0                  " SU05      n[*        R,                  " SU5          U R2                  R5                  U R6                   S3USU R8                  -   SS.S9I S h  vN n[*        R,                  " SURB                  5        URD                  S:X  a   U RG                  UR/                  5       S9  g g  GNs  sn	f s  snnf  Nc! [:        R<                   a$  n[?        UR@                  RB                  5      eS nAff = f7f)N)rD   guardrail_nameF messagesr=   role
tool_callscontent)rS   rU   function	argumentsr   z Function Input:  c                     [         U S      $ )Nr   )INPUT_POSITIONING_MAP)xs    r/   <lambda>,lakeraAI_Moderation._check.<locals>.<lambda>   s    =RSTUVSW=Xr1   )keyz>Skipping lakera prompt injection, no roles with messages foundinput
zLakera AI Request Args %sz/v1/prompt_injectionzBearer zapplication/json)AuthorizationzContent-Type)urlrD   headerszLakera AI response: %s   )r2   )$r   GUARDRAIL_NAME
isinstancelistlitellmguardrail_name_config_mapr>   enabled_rolesr   r   appendvaluestrrZ   keysSYSTEMadd_function_to_promptr?   joinsorteditemsr	   debugjsondumpsr&   postr   r)   httpxHTTPStatusError	Exceptionr2   textr;   rB   )r,   rD   rE   rF   r{   
_json_dataprompt_injection_objrj   stringified_rolesrS   lakera_input_dictsystem_messagetool_call_messagesmessagerU   function_input	tool_callkvlakera_inputr2   es                         r/   _checklakeraAI_Moderation._checky   s      3-  	 
*T*-=t"D"D11556HI ! $/ 4 B B $$ -+-()D!$--)00<#D#..)006	 * (='A'A'C''Ctd
'C  ' "N')
+{{6*,#w../.$\2.* t{{000)0  !%#*;;y#9/%+ ,, )55,00;G%'N%7	%2*11)J2G2TU &8 >*Q.#6.9Q#QQ $ 1 1#*<%dkk&7&78 #%++-3XDAq 	    < A%$**T \*DD)J_DM3!?!?=DWdO4J_DM4!@!@99T']+DWdO4J""#>
K
	
	-!//44}}o%9:%.1D1D%D$6 5  H 	""#;X]]K3&2 (((--/(B7 'm8'TJ $$ 	-AJJOO,,	-s   POB5P+P9O"P+A?P.BP
OOC"P:;O 5O6O :APPO P/PPPcachec                    #    SSK Jn  U R                  c  U R                  S:X  a  g OU R	                  X5R
                  S9SLa  g U R                  X1US9I S h  vN $  N7f)Nr   GuardrailEventHooksr   rD   
event_typeTrD   rE   rF   )litellm.types.guardrailsr   
event_hookr   should_run_guardrailr   r   )r,   rE   r   rD   rF   r   s         r/   async_pre_call_hook'lakeraAI_Moderation.async_pre_call_hook  s}       	A??"$$5 6 ))*F*F *  
 [[i ! 
 
 	
 
s   AAAA)rG   rI   rJ   rK   rL   c                    #    U R                   c  U R                  S:X  a  g O%SSKJn  UR                  nU R                  XS9SLa  g U R                  XUS9I S h  vN $  N7f)Nr   r   r   r   Tr   )r   r   r   r   during_callr   r   )r,   rD   rE   rF   r   r   s         r/   async_moderation_hook)lakeraAI_Moderation.async_moderation_hook@  sw      ??"$$
2 3 E.A.M.MJ((d(JRVV[[i ! 
 
 	
 
s   AA!AA!)r   r&   r   r)   r   )r   NNN)__name__
__module____qualname____firstlineno__r   r   r   rm   r+   dictrB   r   r   rh   	DualCacher   r   rz   r   r   __static_attributes____classcell__)r.   s   @r/   r   r   /   s&    @MBF"&!%#!";<# &&>?# 3-	#
 ## #(3 3 3jaCaC *aC 	
	aCF"
)"
   "
 	"

 	
"
 
%	3,-	."
H

 *
 #
	
 
r1   r   ))r'   syspathinsertabspathru   typingr   r   r   r   r   rx   fastapir   rh   litellm._loggingr	   %litellm.integrations.custom_guardrailr
   &litellm.llms.custom_httpx.http_handlerr   r   litellm.proxy._typesr   *litellm.proxy.guardrails.guardrail_helpersr   litellm.secret_managers.mainr   r   r   r   r   r   re   ro   rl   USER	ASSISTANTrZ   r   r$   r1   r/   <module>r      s    
 
 rwww  
 7 7  !  1 A 0 W 3  + 	KKqIIOOQNN! j
/ j
r1   