
    g3                        d dl Z d dlZej                  j                  d e j                  j	                  d             d dlZd dlZd dlmZmZm	Z	m
Z
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 d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZm Z m!Z!m"Z" dZ#e!jH                  jJ                  d e!jL                  jJ                  de!jN                  jJ                  diZ( G d de      Z)y)    Nz../..)DictListLiteralOptionalUnion)HTTPException)verbose_proxy_logger)CustomGuardraillog_guardrail_information)get_async_httpx_clienthttpxSpecialProvider)UserAPIKeyAuth) should_proceed_based_on_metadata)
get_secret)GuardrailItemLakeraCategoryThresholdsRoledefault_roleslakera_prompt_injection      c                        e Zd Z	 	 	 	 dded   dee   dee   dee   f fdZded	dfd
Z	dede
ded   fdZede
dej                  deded   d	eeeeef      f
d       Zedede
ded   fd       Z xZS )lakeraAI_ModerationNmoderation_check)pre_callin_parallelcategory_thresholdsapi_baseapi_keyc                     t        t        j                        | _        |xs t        j
                  d   | _        || _        || _        |xs t        d      xs d| _
        t        | 0  di | y )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         g/var/www/openai/venv/lib/python3.12/site-packages/litellm/proxy/guardrails/guardrail_hooks/lakera_ai.pyr+   zlakeraAI_Moderation.__init__3   sq     4-??
 &E4D)E 0#6 P
#45P9P 	 	"6"    responsereturnc                    |j                  dg       }t        |      dk  ry |d   j                  dd      }|d   j                  dd       }| j                  ||yt        di |}d|v r3d| j                  v r%|d   | j                  d   k\  rt	        dd|d	
      d|v r3d| j                  v r%|d   | j                  d   k\  rt	        dd|d	
      y |du rt	        dd|d	
      y )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,   r1   _resultsr5   r6   typed_cat_scoress         r/   _check_response_flaggedz+lakeraAI_Moderation._check_response_flaggedG   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  r0   datauser_api_key_dict	call_type)
completiontext_completion
embeddingsimage_generation
moderationaudio_transcriptionpass_through_endpointrerankc                   K   t        |t               d {   du ry d}d}d|v rSt        |d   t              r?t        j
                  j                  d      }||j                  }nd }|t        }g }|U|D ]P  }	t        |	t              r|j                  |	j                         /t        |	t              s@|j                  |	       R t        j                         D 	ci c]  }	|	d  }
}	d }g }|d   D ]\  }|j                  d      }	|	|v sd|v r	g ||d   }|	t        j                  j                  k(  r|}F|	|j                  d      d	|
|	<   ^ |t        j                   s|j                  d      }g }|D ]  }d
|v s|j                  |d
   d            t#        |      dkD  r|ddj%                  |      z   z  }t        j                  j                  |d	|
t        j                  j                  <   t'        |
j)                         d       D cg c]	  \  }}|| }}}t#        |      dk(  rt+        j,                  d       y d|i}t/        j0                  |fi | j3                  |      }nd|v rBt        |d   t              r/|d   }t/        j0                  d|i| j3                  |            }nTd|v rPt        |d   t              r=dj%                  |d         }t/        j0                  d|i| j3                  |            }t+        j,                  d|       	 	 | j4                  j7                  | j8                   d|d| j:                  z   dd       d {   }t+        j,                  d|jD                         |jF                  dk(  r"	 | jI                  |j/                                y y 7 c c}	w c c}}w 7 d# t<        j>                  $ r$}tA        |jB                  jD                        d }~ww xY ww)N)rB   guardrail_nameF messagesr<   role
tool_callscontent)rQ   rS   function	argumentsr   z Function Input:  c                     t         | d      S )Nr   )INPUT_POSITIONING_MAP)xs    r/   <lambda>z,lakeraAI_Moderation._check.<locals>.<lambda>   s    =RSTUVSW=Xr0   )keyz>Skipping lakera prompt injection, no roles with messages foundinput)request_data
zLakera AI Request Args %sz/v1/prompt_injectionzBearer zapplication/json)AuthorizationzContent-Type)urlrB   headerszLakera AI response: %s   )r1   )%r   GUARDRAIL_NAME
isinstancelistlitellmguardrail_name_config_mapr=   enabled_rolesr   r   appendvaluestrrX   keysSYSTEMadd_function_to_promptr>   joinsorteditemsr	   debugjsondumps)get_guardrail_dynamic_request_body_paramsr&   postr   r)   httpxHTTPStatusError	Exceptionr1   textr:   rA   )r,   rB   rC   rD   rz   
_json_dataprompt_injection_objrh   stringified_rolesrQ   lakera_input_dictsystem_messagetool_call_messagesmessagerS   function_input	tool_callkvlakera_input_datar1   es                          r/   _checkzlakeraAI_Moderation._check|   s\      3-  	 
*T*-=t"D11556HI ! $/ 4 B B $$ -+-()D!$-)00<#D#.)006	 * (='A'A'C''Ctd
'C  ' "N')
+{{6*,,#w../.$\2.* t{{000)0  !%#*;;y#9/%d+ ,, )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 l+E@@d@SJ _DM3!?=DTDDRVDWJ _DM4!@99T']+DTDDRVDWJ 	""#>
K
	
	-!//44}}o%9:%.1D1D%D$6 5  H 	""#;X]]K3&2 (((--/(B7 'G8'Td $$ 	-AJJOO,,	-sz   POB!P:)P#
O-#PA4PBPO
)DP->O +O,O 0APPO P	%PP		Pcachec                    K   ddl m} | j                  | j                  dk(  r!y | j	                  ||j
                        dury | j                  |||       d {   S 7 w)Nr   GuardrailEventHooksr   rB   
event_typeTrB   rC   rD   )litellm.types.guardrailsr   
event_hookr   should_run_guardrailr   r   )r,   rC   r   rB   rD   r   s         r/   async_pre_call_hookz'lakeraAI_Moderation.async_pre_call_hook,  s     " 	A??"$$5
 ))*=*F*F *  
 [[):i ! 
 
 	
 
s   AA#A!A#)rE   rG   rH   rI   rJ   c                    K   | j                   | j                  dk(  r)y ddlm} |j                  }| j                  ||      dury | j                  |||       d {   S 7 w)Nr   r   r   r   Tr   )r   r   r   r   during_callr   r   )r,   rB   rC   rD   r   r   s         r/   async_moderation_hookz)lakeraAI_Moderation.async_moderation_hookQ  sx      ??"$$
2 E.A.M.MJ((dz(JRVV[[):i ! 
 
 	
 
s   AA%A#A%)r   NNN)__name__
__module____qualname__r   r   r   rk   r+   dictrA   r   r   r   rf   	DualCacher   r   ry   r   r   __classcell__)r.   s   @r/   r   r   2   s:    @MBF"&!%#!";<# &&>?# 3-	#
 ##(3 3 3jnCnC *nC 	
	nC` "
)"
   "
 	"

 	
"
 
%	3,-	."
 "
H 

 *
 #
	
 
r0   r   )*r'   syspathinsertabspathrs   typingr   r   r   r   r   rw   fastapir   rf   litellm._loggingr	   %litellm.integrations.custom_guardrailr
   r   &litellm.llms.custom_httpx.http_handlerr   r   litellm.proxy._typesr   *litellm.proxy.guardrails.guardrail_helpersr   litellm.secret_managers.mainr   r   r   r   r   r   rc   rm   rj   USER	ASSISTANTrX   r   r$   r0   r/   <module>r      s    
 
 rwww  
 7 7  !  1 0 W 3  + 	KKqIIOOQNN! y
/ y
r0   