
    h3                        d dl Z d dlZd dlZd dlmZmZ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 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#m$Z$m%Z% erd dl&m'Z'  G d de(      Z) G d de      Z*y)    N)TYPE_CHECKINGAnyAsyncGeneratorLiteralOptionalTypeUnion)HTTPException)	BaseModel)ClientConnectionconnect)	DualCache)verbose_proxy_logger)version)CustomGuardrail)get_async_httpx_clienthttpxSpecialProvider)UserAPIKeyAuth)ChoicesEmbeddingResponseImageResponseModelResponseModelResponseStream)GuardrailConfigModelc                       e Zd Zy)AimGuardrailMissingSecretsN)__name__
__module____qualname__     l/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/proxy/guardrails/guardrail_hooks/aim/aim.pyr   r   %   s    r!   r   c                       e Zd Z	 d&dee   dee   f fdZdededede	d	   d
e
eeedf   f
dZdedede	d   d
e
eeedf   fdZdededee   d
efdZdeded
dfdZdededed
efdZdedededee   d
ee   f
dZdeded
edz  fdZded
edz  fdZdedee   dee   dee   fdZdedede
eeeef   d
efdZdeded
eedf   fdZd ed
dfd!Zd"ee   d
dfd#Z e!d
ee"d$      fd%       Z# xZ$S )'AimGuardrailNapi_keyapi_basec                    t        t        j                        | _        |xs t        j
                  j                  d      | _        | j                  sd}t        |      |xs# t        j
                  j                  d      xs d| _	        | j                  j                  dd      j                  dd	      | _        g | _        d
| _        t        | <  di | y )N)llm_providerAIM_API_KEYzCouldn't get Aim api key, either set the `AIM_API_KEY` in the environment or pass it as a parameter to the guardrail in the config fileAIM_API_BASEzhttps://api.aim.securityzhttp://zws://zhttps://zwss://d   r    )r   r   GuardrailCallbackasync_handlerosenvirongetr%   r   r&   replacews_api_basedlp_entities_max_dlp_entitiessuper__init__)selfr%   r&   kwargsmsg	__class__s        r"   r6   zAimGuardrail.__init__*   s     4-??
 ?"**.."?||M  -S11T

~6T:T 	  ==00GDLL
 )+!$"6"r!   user_api_key_dictcachedata	call_type)
completiontext_completion
embeddingsimage_generation
moderationaudio_transcriptionpass_through_endpointrerankreturnc                    K   t        j                  d       | j                  |d|j                         d {   S 7 w)NzInside AIM Pre-Call Hookpre_callhook	key_aliasr   debugcall_aim_guardrailrL   )r7   r;   r<   r=   r>   s        r"   async_pre_call_hookz AimGuardrail.async_pre_call_hookA   sG       	""#=>,,z->-H-H - 
 
 	
 
s   7A >A )r?   rA   rB   rC   rD   	responsesc                    K   t        j                  d       | j                  |d|j                         d {    |S 7 w)NzInside AIM Moderation HookrC   rJ   rM   )r7   r=   r;   r>   s       r"   async_moderation_hookz"AimGuardrail.async_moderation_hookW   sN      	""#?@%%|/@/J/J & 
 	
 	
 	
s   7AA ArK   rL   c           	        K   |j                  di       j                  di       j                  d      }|j                  d      }| j                  ||||      }| j                  j                  | j                   d|d|j                  dg       i       d {   }|j                          |j                         }|j                  d	      }	|	xr |	j                  d
d       }
|
t        j                  d       |S |
dk(  rt        j                  d       |S |
dk(  r| j                  |d   |	       |S |
dk(  r| j                  |d   |	|      S t        j                  d|
 d       |S 7 ҭw)Nmetadataheadersx-aim-user-emaillitellm_call_idrK   rL   
user_emailrX   z/detect/openai/v2messagesrV   jsonrequired_actionaction_typez!Aim: No required action specifiedmonitor_actionzAim: monitor actionblock_actionanalysis_resultanonymize_actionzAim: z action)r0   _build_aim_headersr-   postr&   raise_for_statusr]   r   rN   info_handle_block_action_anonymize_requesterror)r7   r=   rK   rL   rZ   call_idrV   responseresr^   r_   s              r"   rO   zAimGuardrail.call_aim_guardrailk   s     XXj"-11)R@DDEWX
((,-))!#	 * 
 ++00}}o./dhhz267 1 
 

 	!!#mmo''"34%R/*=*=mT*R &&'JKK** %%&;<  N*%%c*;&<oN  ..**%&  !&&{m7'CD-
s   BE/E-CE/rb   r^   c                     |j                  dd       }t        j                  dj                  t	        |d   j                                            t        d|      )Ndetection_messagez4Aim: Violation detected enabled policies: {policies}policy_drill_down)policies  status_codedetail)r0   r   rg   formatlistkeysr
   r7   rb   r^   ro   s       r"   rh   z!AimGuardrail._handle_block_action   s_    +//0CTJ!!BIIo.ABGGIJ J 	

 4EFFr!   c                 6   t        j                  d       |xr |j                  d      }|s|S |r1|j                  d      r | j                  |j                  d             |d   d   |d   d   dg|d   D cg c]  }|d   |d   d c}z   |d	<   |S c c}w )
NzAim: anonymize actionchat_redaction_resultsession_entitiesredacted_new_messagerolecontent)r~   r   all_redacted_messagesr[   )r   rg   r0   _set_dlp_entities)r7   rb   r^   r=   redaction_resultmessages         r"   ri   zAimGuardrail._anonymize_request   s     	!!"9:* 
/B/B#0
  K223EF""?#6#67I#JK ))?@H+,BCIN
 ,,CD

   "9-

Z 
s   :Brequest_dataoutputc           	      ,  K   |j                  di       j                  di       j                  d      }|j                  d      }| j                  j                  | j                   d| j	                  ||||      ||j                  dg       d	       d {   }|j                          |j                         }|j                  d
      }	|	xr |	j                  dd       }
|
r|
dk(  r| j                  |d   |	      S | j                  |      S 7 xw)NrU   rV   rW   rX   z/detect/output/v2rY   r[   )r   r[   r\   r^   r_   ra   rb   )	r0   r-   re   r&   rd   rf   r]   _handle_block_action_on_output_deanonymize_output)r7   r   r   rK   rL   rZ   rk   rl   rm   r^   r_   s              r"   call_aim_guardrail_on_outputz)AimGuardrail.call_aim_guardrail_on_output   s-     Z,00B?CCDVW 	 ""#45++00}}o./++#% '	 ,  #0@0@R0PQ 1 	
 	
 	!!#mmo''"34%R/*=*=mT*R;.866%&  ''//%	
s   BDDA9Dc           	          |j                  dd       }t        j                  dj                  dt	        |d   j                                            d|iS )Nro   z7Aim: detected: {detected}, enabled policies: {policies}Trp   )detectedrq   )r0   r   rg   rv   rw   rx   ry   s       r"   r   z+AimGuardrail._handle_block_action_on_output   sb     ,//0CTJ!!ELLo.ABGGIJ M 	
 $%677r!   c                     	 | j                   D ]  }|j                  d|d    d|d         }  d|iS # t        $ r"}t        j                  d|        Y d }~y d }~ww xY w)N[name]r   redacted_outputz#Aim: Error while redacting output: )r3   r1   	Exceptionr   rj   )r7   r   entityes       r"   r   z AimGuardrail._deanonymize_output   sn    	++!F6N+;1(=vi?PQ ,%v.. 	 &&)LQC'PQ	s   03 	AAArZ   rX   c                j    d| j                    |t        d|rd|ini z  |rd|ini z  |rd|iz  S i z  S )zb
        A helper function to build the http headers that are required by AIM guardrails.
        zBearer )Authorizationzx-aim-litellm-hookzx-aim-litellm-versionzx-aim-litellm-call-idrW   zx-aim-litellm-key-alias)r%   litellm_version)r7   rK   rL   rZ   rX   s        r"   rd   zAimGuardrail._build_aim_headers   ss     $+4<<.!9&*)8 >M'9RTV 4>"J/2
G   .y	
$ #	
r!   rl   c                   K   t        |t              r|j                  rt        |j                  d   t              r|j                  d   j                  j
                  xs d}| j                  ||d|j                         d {   }|r-|j                  d      rt        d|j                  d            |r>|j                  d      r-|j                  d      |j                  d   j                  _        |S 7 uw)	Nr    r   rJ   ro   rr   rs   r   )

isinstancer   choicesr   r   r   r   rL   r0   r
   )r7   r=   r;   rl   r   aim_output_guardrail_results         r"   async_post_call_success_hookz)AimGuardrail.async_post_call_success_hook  s      x/  8++A.8&&q)1199?RG040Q0QgH8I8S8S 1R 1 +' +/J/N/N#0 $ #6::;NO  +/J/N/N!0 7R6U6U%7  #++3 !+s   BC=C;A6C=c           	     B  K   |j                  di       j                  di       j                  d      }|j                  d      }t        | j                   d| j                  d|j                  ||            4 d {   }t        j                  | j                  ||            }	 t        j                  |j                          d {         }|j                  d	      x}	rt        j                  |	       n~|j                          |j                  d
      r	 d d d       d {    y |j                  d      x}
rddlm}  ||
      t!        j"                  d|        	 d d d       d {    y 7 7 7 V7 # 1 d {  7  sw Y   y xY ww)NrU   rV   rW   rX   z/detect/output/wsr   rY   )additional_headersverified_chunkdoneblocking_messager   )StreamingCallbackErrorz#Unknown message received from AIM: )r0   r   r2   rd   rL   asynciocreate_taskforward_the_stream_to_aimr]   loadsrecvr   model_validatecancellitellm.proxy.proxy_serverr   r   rj   )r7   r;   rl   r   rZ   rk   	websocketsenderresultr   r   r   s               r"   'async_post_call_streaming_iterator_hookz4AimGuardrail.async_post_call_streaming_iterator_hook  s     Z,00B?CCDVW 	 ""#45  12#66+55% '	  7  
 	 	 ((..y(CF )..*:$:;%+ZZ0@%AA>A-<<^LLMMOzz&)'	 	 	( ,2::6H+II'IU45EFF(..=fXF 7	 	 	 	 %;	 	 	 	 	s   A>F FFA	F
F
AF
$F/F0F5:F
/F:F;F F
FF
FF
FFFFr   c                 H  K   |2 3 d {   }t        |t              r|j                         }t        |t              rt	        j
                  |      }|j                  |       d {    h7 c7 6 |j                  t	        j
                  ddi             d {  7   y w)Nr   T)r   r   model_dump_jsondictr]   dumpssend)r7   r   response_iterchunks       r"   r   z&AimGuardrail.forward_the_stream_to_aimF  s     
 ) 	( 	(%%+--/%&

5)..'''	(
 ( ) nnTZZ7888sD   B"A1A-A1AB"'A/(B"-A1/B"1*B"BB"entitiesc                 ,    |d | j                    | _        y )N)r4   r3   )r7   r   s     r"   r   zAimGuardrail._set_dlp_entitiesS  s    $%=t'='=>r!   r   c                      ddl m}  | S )Nr   AimGuardrailConfigModel)2litellm.types.proxy.guardrails.guardrail_hooks.aimr   r   s    r"   get_config_modelzAimGuardrail.get_config_modelV  s    	
 '&r!   )NN)%r   r   r   r   strr6   r   r   r   r   r	   r   rP   rS   rO   r   rh   ri   r   r   r   rd   r   r   r   r   r   r   r   r   r   rw   r   staticmethodr   r   __classcell__)r:   s   @r"   r$   r$   )   s   GK#}#7?}#.
)
 
 	

 	

 
y#tT)	*
, * 
	 
y#tT)	*(!! #!08!	!FGC G# GRV G"58@D	20 0*-0580EMc]0	$06
8"
858
8	
8# $+ 
 
 C=	

 SM
 "#
B * ],=}LM	
 
<%)% 	%
 
+T1	2%N9#9 
	9?$t* ? ? 'ht,B'CD ' 'r!   r$   )+r   r]   r.   typingr   r   r   r   r   r   r	   fastapir
   pydanticr   websockets.asyncio.clientr   r   litellmr   litellm._loggingr   litellm._versionr   r   %litellm.integrations.custom_guardrailr   &litellm.llms.custom_httpx.http_handlerr   r   litellm.proxy._typesr   litellm.types.utilsr   r   r   r   r   3litellm.types.proxy.guardrails.guardrail_hooks.baser   r   r   r$   r    r!   r"   <module>r      sd      	 U U U !  ?  1 7 A 0  X	 	s'? s'r!   