
    g+                     R   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m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 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!m"Z" d dl#m$Z$ dZ% G d dee      Z&y)    Nz../..)AnyDictListLiteralOptionalUnion)HTTPException)verbose_proxy_logger)CustomGuardraillog_guardrail_information)
BaseAWSLLM)get_async_httpx_clienthttpxSpecialProvider)UserAPIKeyAuth)
get_secret)BedrockContentItemBedrockRequestBedrockTextContentGuardrailEventHooks)ModelResponsebedrockc            
           e Zd Z	 	 ddee   dee   f fdZ	 	 ddeeeeef         deee	e
f      defdZd Z	 dd	ed
ededee   fdZ	 ddedeee	ej                  f      fdZed	ededed   fd       Zed	edefd       Z xZS )BedrockGuardrailguardrailIdentifierguardrailVersionc                     t        t        j                        | _        || _        || _        || _        t        |    di | y )N)llm_provider )	r   r   GuardrailCallbackasync_handlerr   r   optional_paramssuper__init__)selfr   r   kwargs	__class__s       p/var/www/openai/venv/lib/python3.12/site-packages/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.pyr#   zBedrockGuardrail.__init__-   sG     4-??
 $7  0  &"6"    messagesresponsereturnc                 b   t        d      }g }|rU|D ]K  }|j                  d      }t        |t              s%t	        t        |            }|j                  |       M ||d<   |rd|d<   t        |t        j                        r|j                  D ]  }t        |t        j                        s|j                  j                  s5t        |j                  j                  t              sZt	        t        |j                  j                              }|j                  |        ||d<   |S )NINPUT)sourcecontent)textOUTPUTr.   )r   get
isinstancestrr   r   appendlitellmr   choicesChoicesmessager/   )	r$   r)   r*   bedrock_requestbedrock_request_contentr9   r/   bedrock_content_itemchoices	            r'   convert_to_bedrock_formatz*BedrockGuardrail.convert_to_bedrock_format>   s   
 +9*H<>#!++i0gs++=/W=,( ,223GH $ *AOI&(0OH%(G$9$9:&..F!&'//:!>>11j"NN22C7 4F%7V^^=S=S%T40 4::;OP / .E	*r(   c                 8   	 ddl m} | j                  j	                  dd       }| j                  j	                  dd       }| j                  j	                  dd       }| j                  j	                  dd       }| j                  j	                  dd       }| j                  j	                  d	d       }| j                  j	                  d
d       }| j                  j	                  dd        | j                  j	                  dd       }	| j                  j	                  dd       }
|Dt        dd       }|t        |t              r|}t        dd       }|t        |t              r|}|d}| j                  ||||||||	|
	      }||fS # t        $ r t        d      w xY w)Nr   )Credentials7Missing boto3 to call bedrock. Run 'pip install boto3'.aws_secret_access_keyaws_access_key_idaws_session_tokenaws_region_nameaws_role_nameaws_session_nameaws_profile_nameaws_bedrock_runtime_endpointaws_web_identity_tokenaws_sts_endpointAWS_REGION_NAME
AWS_REGIONz	us-west-2)	rC   rB   rD   rE   rG   rH   rF   rJ   rK   )	botocore.credentialsr@   ImportErrorr!   popr   r3   r4   get_credentials)r$   r@   rB   rC   rD   rE   rF   rG   rH   rJ   rK   litellm_aws_region_namestandard_aws_region_namecredentialss                 r'   _load_credentialsz"BedrockGuardrail._load_credentials`   s   	Y8
 !% 4 4 8 89PRV W 00445H$O 00445H$O..223DdK,,00$G//334FM//334FM  *D	
 "&!5!5!9!9$d"
  //334FM "&01BD&I#&2z'8 #:'1,'E$'3
(#9 #;&"-#'#7#7/"7/+--'#9- $8 
$
 O++c  	YWXX	Ys   F Fdatar!   rE   extra_headersc                    	 ddl m} ddlm}  ||d|      }d| d| j
                   d| j                   d	}	t        j                  |      j                  d
      }
ddi}|ddi|} |d|	|
|      }|j                  |       |d|v r|d   |j                  d<   |j                         }|S # t        $ r t	        d      w xY w)Nr   )	SigV4Auth)
AWSRequestrA   r   zhttps://bedrock-runtime.z.amazonaws.com/guardrail/z	/version/z/applyzutf-8zContent-Typezapplication/jsonPOST)methodurlrV   headersAuthorization)botocore.authrY   botocore.awsrequestrZ   rO   r   r   jsondumpsencodeadd_authr^   prepare)r$   rT   rV   r!   rE   rW   rY   rZ   sigv4api_baseencoded_datar^   requestprepped_requests                 r'   _prepare_requestz!BedrockGuardrail._prepare_request   s   	Y/6 +y/B-o->>WX\XpXpWqqz{  |Q  |Q  {R  RX  Yzz$'..w7!#56$%'9K]KGxlG
 	w%/]*J/<_/MGOOO,!//+-  	YWXX	Ys   B/ /Cr%   c                 
  K   | j                         \  }}t        | j                  |j                  d      |            }|j	                  | j                  |             | j                  ||| j                  |      }t        j                  d||j                  |j                         | j                  j                  |j                  |j                  |j                         d {   }t        j                  d|j                         |j                   dk(  r5|j#                         }|j                  d	      d
k(  rt%        dd|d      y t        j&                  d|j                   |j                         y 7 w)Nr)   )r)   r*   )request_data)rT   rV   r!   rE   z0Bedrock AI request body: %s, url %s, headers: %s)r]   rV   r^   zBedrock AI response: %s   actionGUARDRAIL_INTERVENEDi  zViolated guardrail policy)errorbedrock_guardrail_response)status_codedetailz<Bedrock AI: error in response. Status code: %s, response: %s)rU   dictr>   r2   update)get_guardrail_dynamic_request_body_paramsrl   r!   r
   debugr]   r^   r    postbodyr0   rt   rb   r	   rr   )r$   r%   r*   rT   rE   bedrock_request_dataprepared_request_json_responses           r'   make_bedrock_api_requestz)BedrockGuardrail.make_bedrock_api_request   s     (,'='='?$_%)**J/( + &

 	##:::O	
  00#% 00+	 1 
 	"">   $$		
 ++00 $$!&&$,, 1 
 

 	""#<hmmL3&%]]_N!!(+/EE# #!<6D  F !&&N$$%
s   C*F,F-BFuser_api_key_dict	call_type)
completion
embeddingsimage_generation
moderationaudio_transcriptionc                   K   ddl m} t        j                  }| j	                  ||      dury |j                  d      }|/| j                  |       d {     ||| j                         y t        j                  d       y 7 /w)	Nr   *add_guardrail_to_applied_guardrails_headerrV   
event_typeTr)   )r%   rn   guardrail_name6Bedrock AI: not running guardrail. No messages in data)
)litellm.proxy.common_utils.callback_utilsr   r   during_callshould_run_guardrailr2   r   r   r
   warning)r$   rV   r   r   r   r   new_messagess          r'   async_moderation_hookz&BedrockGuardrail.async_moderation_hook   s     	
 +>*I*I
$$$:$FdR-1XXj-A#//t/<<<6!$2E2E !((H  =s   AB	B0B	c                   K   ddl m} ddlm} | j	                  ||j
                        dury |j                  d      }|0| j                  ||       d {     ||| j                         y t        j                  d	       y 7 /w)
Nr   r   )r   r   Tr)   )r%   r*   r   r   )r   r   litellm.types.guardrailsr   r   	post_callr2   r   r   r
   r   )r$   rV   r   r*   r   r   r   s          r'   async_post_call_success_hookz-BedrockGuardrail.async_post_call_success_hook  s     	
 	A %%&9&C&C &  
 -1XXj-A#//th/OOO6!$2E2E !((H Ps   AB
B0B
)NN)N)__name__
__module____qualname__r   r4   r#   r   r   r   r   r   r   r>   rU   rv   rl   r6   r   r   r   r   r   r   __classcell__)r&   s   @r'   r   r   ,   sE    .2*.#%c]# #3-#& 488<4S#X/0 5m!345 
	D6,| )-! ! 	!
 !  ~!H UY00&.uS':O:O5O/P&Q0d  * #
	 @  * r(   r   )'ossyspathinsertabspathrb   typingr   r   r   r   r   r   fastapir	   r6   litellm._loggingr
   %litellm.integrations.custom_guardrailr   r   !litellm.llms.bedrock.base_aws_llmr   &litellm.llms.custom_httpx.http_handlerr   r   litellm.proxy._typesr   litellm.secret_managers.mainr   r   r   r   r   r   litellm.types.utilsr   GUARDRAIL_NAMEr   r   r(   r'   <module>r      s    
 
 rwww  
 < < !  1 9 0 3  .
 r(   