
    ^h(                         S r SSKrSSKrSSKJrJrJr  SSK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
\5      rg)a  
This is a file for the AWS Secret Manager Integration

Handles Async Operations for:
- Read Secret
- Write Secret
- Delete Secret

Relevant issue: https://github.com/BerriAI/litellm/issues/1883

Requires:
* `os.environ["AWS_REGION_NAME"], 
* `pip install boto3>=1.28.57`
    N)AnyOptionalUnion)verbose_logger)
BaseAWSLLM)_get_httpx_clientget_async_httpx_client)KeyManagementSystem)httpxSpecialProviderc                      \ rS rSr\S 5       r\S\\   4S j5       r  SS\	S\\
   S\\\\R                  4      S	\\	   4S
 jjr  SS\	S\\
   S\\\\R                  4      S	\\	   4S jjr    SS\	S\	S\\	   S\\	   S\\
   S\\\\R                  4      S	\
4S jjr   SS\	S\\   S\\
   S\\\\R                  4      S	\
4
S jjr   SS\	S\	S\\	   S\\
   S\\
   S	\\	\\4   4S jjrSrg)AWSSecretsManagerV2!   c                 B    S[         R                  ;  a  [        S5      eg )NAWS_REGION_NAMEz7Missing required environment variable - AWS_REGION_NAME)osenviron
ValueError)clss    g/home/james-whalen/.local/lib/python3.13/site-packages/litellm/secret_managers/aws_secret_manager_v2.pyvalidate_environment(AWSSecretsManagerV2.validate_environment"   s    BJJ.VWW /    use_aws_secret_managerc                     Ub  USL a  g U R                  5         U " 5       [        l        [        R                  [        l        g! [         a  nUeSnAff = f)z
Initialize AWSSecretsManagerV2 and sets litellm.secret_manager_client = AWSSecretsManagerV2() and litellm._key_management_system = KeyManagementSystem.AWS_SECRET_MANAGER
NF)r   litellmsecret_manager_clientr
   AWS_SECRET_MANAGER_key_management_system	Exception)r   r   es      r   load_aws_secret_manager+AWSSecretsManagerV2.load_aws_secret_manager'   sS    
 ")-Cu-L	$$&,/EG)-@-S-SG* 	G	s   9A 
AAANsecret_nameoptional_paramstimeoutreturnc                   #    U R                  SUUS9u  pEn[        [        R                  SU0S9n UR	                  XEUR                  S5      S9I Sh  vN nUR                  5         UR                  5       S   $  N'! [        R                   a    [        S	5      e[         a*  n	[        R                  " S
[        U	5      5         Sn	A	gSn	A	ff = f7f)z
Async function to read a secret from AWS Secrets Manager

Returns:
    str: Secret value
Raises:
    ValueError: If the secret is not found or an HTTP error occurs
GetSecretValueactionr#   r$   r%   llm_providerparamsutf-8urlheadersdataNSecretStringTimeout error occurred1Error reading secret from AWS Secrets Manager: %s)_prepare_requestr	   r   SecretManagerpostdecoderaise_for_statusjsonhttpxTimeoutExceptionr   r   r   	exceptionstr)
selfr#   r$   r%   endpoint_urlr1   bodyasync_clientresponser    s
             r   async_read_secret%AWSSecretsManagerV2.async_read_secret7   s      '+&;&;##+ '< '
#t .-;;w'

	).. G8L /  H %%'==?>22	
 %% 	7566 	$$CSV  		s@   /C"A> A<&A> ;C<A> >(C& CCCCc                    US;   a  [         R                  " U5      $ U R                  SUUS9u  pEn[        SU0S9n UR	                  XEUR                  S5      S9nUR                  5         UR                  5       S   $ ! [        R                   a    [        S	5      e[         a*  n	[        R                  " S
[        U	5      5         Sn	A	gSn	A	ff = f)z
Sync function to read a secret from AWS Secrets Manager

Done for backwards compatibility with existing codebase, since get_secret is a sync function
)AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYr   
AWS_REGIONAWS_BEDROCK_RUNTIME_ENDPOINTr(   r)   r%   )r-   r.   r/   r3   r4   r5   N)r   getenvr6   r   r8   r9   r:   r;   r<   r=   r   r   r   r>   r?   )
r@   r#   r$   r%   rA   r1   rB   sync_clientrD   r    s
             r   sync_read_secret$AWSSecretsManagerV2.sync_read_secret^   s      
 
 99[))&*&;&;##+ '< '
#t (w'
	"'' G8L ( H %%'==?>22%% 	7566 	$$CSV  		s   AA? ?(C' CCsecret_valuedescriptionclient_request_tokenc                   #    SSK nXS.nU(       a  X8S'   [        UR                  5       5      US'   U R                  SUUUUS9u  pn[	        [
        R                  SU0S	9n UR                  XUR                  S
5      S9I Sh  vN nUR                  5         UR                  5       $  N$! [        R                   a'  n[        SUR                  R                   35      eSnAf[        R                    a    [        S5      ef = f7f)ah  
Async function to write a secret to AWS Secrets Manager

Args:
    secret_name: Name of the secret
    secret_value: Value to store (can be a JSON string)
    description: Optional description for the secret
    client_request_token: Optional unique identifier to ensure idempotency
    optional_params: Additional AWS parameters
    timeout: Request timeout
r   N)Namer3   DescriptionClientRequestTokenCreateSecret)r*   r#   rP   r$   request_datar%   r+   r.   r/   HTTP error occurred: r4   )uuidr?   uuid4r6   r	   r   r7   r8   r9   r:   r;   r<   HTTPStatusErrorr   rD   textr=   )r@   r#   rP   rQ   rR   r$   r%   rZ   r2   rA   r1   rB   rC   rD   errs                  r   async_write_secret&AWSSecretsManagerV2.async_write_secret   s    ( 	 $B"-%(%6!"&*&;&;!#%+ '< '
#t .-;;w'

		7).. G8L /  H %%'==?"	
 $$ 	J4S\\5F5F4GHII%% 	7566	7s<   A D#"B, B*#B, )D*B, ,D "C""#DDrecovery_window_in_daysc                   #    UUS.nU R                  SUUUS9u  pgn[        [        R                  SU0S9n	 U	R	                  XgUR                  S5      S9I Sh  vN n
U
R                  5         U
R                  5       $  N$! [        R                   a'  n[        S	UR                  R                   35      eSnAf[        R                   a    [        S
5      ef = f7f)ab  
Async function to delete a secret from AWS Secrets Manager

Args:
    secret_name: Name of the secret to delete
    recovery_window_in_days: Number of days before permanent deletion (default: 7)
    optional_params: Additional AWS parameters
    timeout: Request timeout

Returns:
    dict: Response from AWS Secrets Manager containing deletion details
)SecretIdRecoveryWindowInDaysDeleteSecret)r*   r#   r$   rX   r%   r+   r.   r/   NrY   r4   )r6   r	   r   r7   r8   r9   r:   r;   r<   r\   r   rD   r]   r=   )r@   r#   ra   r$   r%   r2   rA   r1   rB   rC   rD   r^   s               r   async_delete_secret'AWSSecretsManagerV2.async_delete_secret   s     * $$;

 '+&;&;!#+	 '< '
#t .-;;w'

		7).. G8L /  H %%'==?"	
 $$ 	J4S\\5F5F4GHII%% 	7566	7s:   5C"B A?#B >C?B C"B77#CCr*   rX   c                 6    SSK Jn  SSKJn  U=(       d    0 nU R                  U5      nU R                  SUR                  UR                  S9u  pU
R                  SS5      n
U(       a  UnOS	U0nU(       a
  US
:X  a  X;S'   [        R                  " U5      R                  S5      nSSU 3S.nU" SXUS9nU" UR                  SUR                  5      R                  U5        UR                  5       nXR                   U4$ ! [         a    [	        S5      ef = f)z'Prepare the AWS Secrets Manager requestr   )	SigV4Auth)
AWSRequestz7Missing boto3 to call bedrock. Run 'pip install boto3'.N)api_baseaws_bedrock_runtime_endpointaws_region_namezbedrock-runtimesecretsmanagerrc   PutSecretValuer3   r.   zapplication/x-amz-json-1.1zsecretsmanager.)zContent-TypezX-Amz-TargetPOST)methodr0   r2   r1   )botocore.authri   botocore.awsrequestrj   ImportError*_get_boto_credentials_from_optional_paramsget_runtime_endpointrl   rm   replacer;   dumpsencodecredentialsadd_authpreparer1   )r@   r*   r#   rP   r$   rX   ri   rj   boto3_credentials_info_rA   r2   rB   r1   requestpreppeds                   r   r6   $AWSSecretsManagerV2._prepare_request   s?   	Y/6 */R!%!P!P"

 33)?)\)\2BB 4 

 $++,=?OP D,D*: :'3^$zz$&&w/8-fX6
 |
 	".."22	
 (7
//#__d22Q  	YWXX	Ys   D D )NN)NNNN)   NN)NNN)__name__
__module____qualname____firstlineno__classmethodr   r   boolr!   r?   dictr   floatr<   TimeoutrE   rN   r_   intrf   tupler   bytesr6   __static_attributes__r   r   r   r   r   !   s   X X Xd^  $ +/9=	%% "$% %u}} 456	%
 
#%T +/9=	,, "$, %u}} 456	,
 
#,d &*.2*.9=3737 37 c]	37
 'sm37 "$37 %u}} 45637 
37p 23*.9=.7.7 "*#.7 "$	.7
 %u}} 456.7 
.7h '+*.'+4343 43 sm	43
 "$43 tn43 
sC	43 43r   r   )__doc__r;   r   typingr   r   r   r<   r   litellm._loggingr   !litellm.llms.bedrock.base_aws_llmr   &litellm.llms.custom_httpx.http_handlerr   r	   litellm.proxy._typesr
   litellm.types.llms.custom_httpr   r   r   r   r   <module>r      s?     	 ' '   + 8 5 ?D3* D3r   