Ë
    uPêj] ã                   óü  — U d dl Z d dlZd dlZd dlZd dlZd dl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mZmZmZ d dl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"m#Z#m$Z$ d dl%m&Z&m'Z' d dl(m)Z) d dl*m+Z+m,Z, erd dl-m.Z. d dl/m0Z0 neZ0eZ. ejb                  d«      Z2ee3d<    ejb                  d«      Z4ee3d<    e5h d£«      Z6ee3d<    G d„ de«      Z7 G d„ de«      Z8 G d„ de9«      Z: G d„ d«      Z;y)é    N)ÚCallable)Údatetime©ÚLock)ÚTYPE_CHECKINGÚAnyÚClassVarÚFinalÚLiteralÚcastÚget_args)Ú	BaseModelÚValidationError)Úverbose_logger)Ú	DualCache)ÚInMemoryCache)Ú#BEDROCK_EMBEDDING_PROVIDERS_LITERALÚ$BEDROCK_IAM_CACHE_FETCH_LOCK_STRIPESÚBEDROCK_IAM_CACHE_MAX_ENTRIESÚ BEDROCK_INVOKE_PROVIDERS_LITERALÚBEDROCK_MAX_POLICY_SIZEÚ+STS_CREDENTIAL_EXPIRY_SAFETY_MARGIN_SECONDS)Úcontains_bedrock_arnÚget_aws_dns_suffix)Útracer)Ú
get_secretÚget_secret_str)ÚAWSPreparedRequest©ÚCredentialsz\A[a-z0-9-]+\ZÚ_VALID_AWS_REGION_PATTERNzU(?:^|\.)sts(?:-fips)?\.([a-z0-9-]+)\.(?:amazonaws\.com(?:\.cn)?|vpce\.amazonaws\.com)Ú!_STS_REGION_FROM_ENDPOINT_PATTERN>   ÚdateÚauthorizationú
x-amz-dateúx-amz-security-tokenÚSIGV4_COMPUTED_HEADERSc                   ó2   — e Zd ZU eed<   eed<   edz  ed<   y)ÚBoto3CredentialsInfoÚcredentialsÚaws_region_nameNÚaws_bedrock_runtime_endpoint)Ú__name__Ú
__module__Ú__qualname__r    Ú__annotations__Ústr© ó    úf/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/bedrock/base_aws_llm.pyr)   r)   3   s   … ØÓØÓØ"%¨¡*Ô,r3   r)   c                   óB   — e Zd ZU dZeee   z  dz  ed<   dZedz  ed<   y)Ú_WebIdentityTokenClaimsNÚaudÚiss)r-   r.   r/   r7   r1   Úlistr0   r8   r2   r3   r4   r6   r6   9   s'   … Ø"&€Cˆˆt�C‰y‰˜4Ñ	Ó&Ø€Cˆˆt‰Ôr3   r6   c                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚAwsAuthErrorc                 óØ   •— || _         || _        t        j                  dd¬«      | _        t        j
                  || j                  ¬«      | _        t        ‰| �!  | j                  «       y )NÚPOSTz0https://us-west-2.console.aws.amazon.com/bedrock)ÚmethodÚurl)Ústatus_codeÚrequest)	r@   ÚmessageÚhttpxÚRequestrA   ÚResponseÚresponseÚsuperÚ__init__)Úselfr@   rB   Ú	__class__s      €r4   rH   zAwsAuthError.__init__?   sL   ø€ Ø&ˆÔØˆŒÜ—}‘}¨FÐ8jÔkˆŒÜŸ™°;ÈÏÉÔUˆŒÜ‰Ñ˜Ÿ™Õ&r3   )r-   r.   r/   rH   Ú__classcell__©rJ   s   @r4   r;   r;   >   s   ø„ ÷'ð 'r3   r;   c                   ó
  ‡ — e Zd ZU  e ee¬«      ¬«      Zee   ed<    e	d„  e
e«      D «       «      Zee	edf      ed<   d\ˆ fd	„Zd]d
eez  dz  fd„Zdeeedz  f   defd„Zdeeedz  f   deg e	eedz  f   f   defd„Zededz  dedz  dedz  defd„«       Zededz  defd„«       Zededz  defd„«       Zededz  dedz  dedz  defd„«       Zededz  dedz  dedz  defd„«       Z ej>                  «       	 	 	 	 	 	 	 	 	 	 	 d^dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  d
eez  dz  fd„«       Z d edz  dedz  fd!„Z!ed"ede"dz  fd#„«       Z#ed ede"dz  fd$„«       Z$ed%ed&e"dz  d edefd'„«       Z%ed ed(edefd)„«       Z&ed*edefd+„«       Z'ed ede(dz  fd,„«       Z)	 	 d_d%ed edz  d*edz  defd-„Z*ededz  ddfd.„«       Z+ededz  dedz  fd/„«       Z,e	 	 d_dedz  dedz  dedz  fd0„«       Z-	 	 	 d`dedz  d
eez  dz  dedz  defd1„Z.	 d]dedz  fd2„Z/ed3ede	eeef   dz  fd4„«       Z0	 d]ded
eez  dz  defd5„Z1ed6ededz  fd7„«       Z2 ej>                  «       	 	 d_dededededz  dedz  dedz  d
eez  dz  de	e3edz  f   fd8„«       Z4	 	 	 	 dad9ededed:ededz  dedz  d
eez  dz  dedz  defd;„Z5	 	 	 	 dadedededz  dedz  d
eez  dz  dedz  defd<„Z6d=ede	e3edz  f   fd>„Z7dedz  dedz  dedz  dededz  dedz  dedz  dedz  d
eez  dz  de	e3edz  f   fd?„Z8 ej>                  «       	 	 	 	 dadedz  dedz  dedz  dedededz  dedz  dedz  d
eez  dz  de	e3edz  f   fd@„«       Z9 ej>                  «       dede	e3edz  f   fdA„«       Z: ej>                  «       dededede	e3edz  f   fdB„«       Z; ej>                  «       dedededz  de	e3edz  f   fdC„«       Z< ej>                  «       de	e3edz  f   fdD„«       Z= ej>                  «       defdE„«       Z>	 dbdFedz  dGedz  dedHe?dI   dz  de	eef   f
dJ„Z@dHe?dI   dz  dedefdK„ZA	 d]d%ed edz  deBfdL„ZC ej>                  «       	 	 dcdMe3dedNedz  dOedPeeDz  dQedRedz  dSedeEfdT„«       ZFdQedefdU„ZG	 	 	 	 dadVe?dW   dQed%edXedFed edz  dYedz  dZedz  dRedz  de	eeDdz  f   fd[„ZHˆ xZIS )dÚ
BaseAWSLLM)Úmax_size_in_memory)Úin_memory_cacheÚ_shared_iam_cachec              #   ó0   K  — | ]  }t        «       –— Œ y ­w©Nr   )Ú.0Ú_s     r4   ú	<genexpr>zBaseAWSLLM.<genexpr>\   s   è ø€ ò @ØŒ�ñ@ùs   ‚.Ú_credential_fetch_locksÚreturnNc                 ó^   •— t         j                  | _        t        ‰| �  «        g d¢| _        y )N)Úaws_access_key_idÚaws_secret_access_keyÚaws_session_tokenr+   Úaws_session_nameÚaws_profile_nameÚaws_role_nameÚaws_web_identity_tokenÚaws_sts_endpointr,   Úaws_external_id)rN   rQ   Ú	iam_cacherG   rH   Úaws_authentication_params)rI   rJ   s    €r4   rH   zBaseAWSLLM.__init__`   s%   ø€ Ü#×5Ñ5ˆŒÜ‰ÑÔò*
ˆÕ&r3   Ú
ssl_verifyc                 ó    — ddl m}  ||¬«      S )av  
        Get SSL verification setting for boto3 clients.

        This ensures that custom CA certificates are properly used for all AWS API calls,
        including STS and Bedrock services.

        Returns:
            Union[bool, str]: SSL verification setting - False to disable, True to enable,
                            or a string path to a CA bundle file
        r   )Úget_ssl_verify©re   )Ú&litellm.llms.custom_httpx.http_handlerrg   )rI   re   rg   s      r4   Ú_get_ssl_verifyzBaseAWSLLM._get_ssl_verifyq   s   € õ 	Já¨Ô4Ð4r3   Úcredential_argsc                 ó’   — t        j                  |d¬«      }t        j                  |j	                  «       «      j                  «       S )zP
        Generate a unique cache key based on the credential arguments.
        T)Ú	sort_keys)ÚjsonÚdumpsÚhashlibÚsha256ÚencodeÚ	hexdigest)rI   rk   Úcredential_strs      r4   Úget_cache_keyzBaseAWSLLM.get_cache_key€   s5   € ô
 !%§
¡
¨?ÀdÔ KˆÜ�~‰~˜n×3Ñ3Ó5Ó6×@Ñ@ÓBÐBr3   Úcredential_fetcherc                 óP  — | j                  |«      }| j                  t        |«      t        | j                  «      z     5  | j                  j                  |«      }|r|cddd«       S  |«       \  }}| j                  j                  |||¬«       |cddd«       S # 1 sw Y   yxY w)u'  
        Read-through IAM cache on the process-wide ``DualCache``.

        Only the in-memory layer is used by default (no Redis on ``_shared_iam_cache`` unless
        configured globally). TTL on write: static access-key fetches pass
        ``_get_default_ttl_for_boto3_credentials()`` (~59 minutes); ambient env passes ``ttl=None``,
        which ``InMemoryCache.set_cache`` resolves to ``default_ttl`` (600 seconds / 10 minutes by
        default).

        Used for static access-key credentials, ambient credentials from
        ``_auth_with_env_vars`` (including when skipping AssumeRole because the runtime identity
        already matches ``aws_role_name``), web identity STS credentials (plain
        non-refreshable ``Credentials`` cached ~59 min, inside the 3600s STS session), and AssumeRole
        STS credentials (cached for the lifetime of the STS session minus a safety margin).

        Profiles and explicit session-token tuples are not cached here â€” shared ``Credentials`` /
        refresh state must not span logical sessions.
        N)Úttl)ru   rW   ÚhashÚlenrc   Ú	get_cacheÚ	set_cache)rI   rk   rv   Ú	cache_keyÚ_cachedr*   rx   s          r4   Ú_get_or_set_cached_credentialsz)BaseAWSLLM._get_or_set_cached_credentialsˆ   sš   € ð.  ×-Ñ-¨oÓ>ˆ	Ø×)Ñ)¬$¨y«/¼CÀ×@\Ñ@\Ó<]Ñ*]Ñ^ñ 	Ø!Ÿ^™^×5Ñ5°iÓ@ˆGÙØ÷	ñ 	ñ  2Ó3ÑˆK˜Ø�N‰N×$Ñ$ Y°ÀÐ$ÔEØ÷	÷ 	ò 	ús   Á BÁ))BÂB%r`   r_   r]   c                 ó"   — | d uxr
 |d uxr |d uS rS   r2   )r`   r_   r]   s      r4   Ú _is_auth_with_web_identity_tokenz+BaseAWSLLM._is_auth_with_web_identity_token¨   s%   € ð &¨TÐ1Òp°mÈ4Ð6OÒpÐTdÐlpÐTpÐpr3   c                 ó
   — | d uS rS   r2   )r_   s    r4   Ú_is_auth_with_aws_rolez!BaseAWSLLM._is_auth_with_aws_role°   s   € à DÐ(Ð(r3   r^   c                 ó
   — | d uS rS   r2   )r^   s    r4   Ú_is_auth_with_aws_profilez$BaseAWSLLM._is_auth_with_aws_profile´   s   € à tÐ+Ð+r3   rZ   r[   r\   c                 ó"   — | d uxr
 |d uxr |d uS rS   r2   ©rZ   r[   r\   s      r4   Ú%_is_auth_with_aws_session_token_tuplez0BaseAWSLLM._is_auth_with_aws_session_token_tuple¸   s&   € ð !¨Ð,ÒtÐ1FÈdÐ1RÒtÐWhÐptÐWtÐtr3   r+   c                 ó"   — | d uxr
 |d uxr |d uS rS   r2   ©rZ   r[   r+   s      r4   Ú'_is_auth_with_access_key_and_secret_keyz2BaseAWSLLM._is_auth_with_access_key_and_secret_keyÀ   s&   € ð !¨Ð,ÒrÐ1FÈdÐ1RÒrÐWfÐnrÐWrÐrr3   ra   rb   c                 óÌ  ‡ ‡‡‡‡‡‡‡‡	‡
‡— t        d„ ‰df‰df‰df‰df‰df|df‰df‰d	f‰	d
f‰
dff
D «       «      \
  ŠŠŠŠŠ}ŠŠŠ	Š
t        j                  d‰du‰du‰du‰‰|‰‰du‰	‰
«       t        «       j	                  «       D ��ci c]  \  }}|j                  d«      s|dk(  sŒ||“Œ! }}}‰ j                  ‰‰‰«      r‰ j                  |ˆ
ˆˆˆˆ	ˆˆ ˆfd„«      S ‰ j                  ‰«      r‰ j                  |ˆˆ
ˆˆˆˆˆˆ	ˆ ˆf
d„«      S ‰ j                  |«      r$‰ j                  t        t        |«      «      \  }}|S ‰ j                  ‰‰‰«      rC‰ j                  t        t        ‰«      t        t        ‰«      t        t        ‰«      ¬«      \  }}|S ‰ j                  ‰‰‰«      r‰ j                  |ˆˆˆˆ fd„«      S ‰ j                  |‰ j                   «      S c c}}w )z3
        Return a boto3.Credentials object
        c              3   óT   K  — | ]   \  }}|�|nt        j                  |«      –— Œ" y ­wrS   )ÚosÚgetenv)rT   ÚvalueÚenv_vars      r4   rV   z-BaseAWSLLM.get_credentials.<locals>.<genexpr>ê   s/   è ø€ ò 
á��wð Ð&‰E¬B¯I©I°gÓ,>Ó>ñ
ùs   ‚&(ÚAWS_ACCESS_KEY_IDÚAWS_SECRET_ACCESS_KEYÚAWS_SESSION_TOKENÚAWS_REGION_NAMEÚAWS_SESSION_NAMEÚAWS_PROFILE_NAMEÚAWS_ROLE_NAMEÚAWS_WEB_IDENTITY_TOKENÚAWS_STS_ENDPOINTÚAWS_EXTERNAL_IDzúin get credentials
aws_access_key_id=[set=%s]
aws_secret_access_key=[set=%s]
aws_session_token=[set=%s]
aws_region_name=%s
aws_session_name=%s
aws_profile_name=%s
aws_role_name=%s
aws_web_identity_token=[set=%s]
aws_sts_endpoint=%s
aws_external_id=%sNÚaws_re   c            	      óˆ   •— ‰j                  t        t        ‰«      t        t        ‰«      t        t        ‰«      ‰‰‰ ‰¬«      S )N)r`   r_   r]   r+   ra   rb   re   )Ú_auth_with_web_identity_tokenr   r1   )rb   r+   r_   r]   ra   r`   rI   re   s   €€€€€€€€r4   ú<lambda>z,BaseAWSLLM.get_credentials.<locals>.<lambda>%  sC   ø€ ˜×:Ñ:Ü+/´Ð5KÓ+LÜ"&¤s¨MÓ":Ü%)¬#Ð/?Ó%@Ø$3Ø%5Ø$3Ø)ð ;ó € r3   c                  óT   •
— ‰j                  ‰ ‰‰t        t        ‰«      ‰‰‰‰‰	¬«	      S )N©	rZ   r[   r\   r_   r]   r+   ra   rb   re   )Ú_resolve_role_credentialsr   r1   )
rZ   rb   r+   r_   r[   r]   r\   ra   rI   re   s
   €€€€€€€€€€r4   rŸ   z,BaseAWSLLM.get_credentials.<locals>.<lambda>2  s9   ø€ ˜×6Ñ6Ø&7Ø*?Ø&7Ü"&¤s¨MÓ":Ø%5Ø$3Ø%5Ø$3Ø)ð 7ó 
€ r3   r‡   c                  ó€   •— ‰j                  t        t        ‰ «      t        t        ‰«      t        t        ‰«      ¬«      S )NrŠ   )Ú$_auth_with_access_key_and_secret_keyr   r1   )rZ   r+   r[   rI   s   €€€€r4   rŸ   z,BaseAWSLLM.get_credentials.<locals>.<lambda>T  s8   ø€ ˜×AÑAÜ&*¬3Ð0AÓ&BÜ*.¬sÐ4IÓ*JÜ$(¬¨oÓ$>ð Bó € r3   )Útupler   ÚdebugÚlocalsÚitemsÚ
startswithr�   r   rƒ   r…   Ú_auth_with_aws_profiler   r1   rˆ   Ú_auth_with_aws_session_tokenr‹   Ú_auth_with_env_vars)rI   rZ   r[   r\   r+   r]   r^   r_   r`   ra   rb   re   ÚkÚvÚargsr*   Ú
_cache_ttls   `````` `````     r4   Úget_credentialszBaseAWSLLM.get_credentialsÈ   sq  ÿú€ ôD ñ 
ð #Ð$7Ð8Ø&Ð(?Ð@Ø"Ð$7Ð8Ø Ð"3Ð4Ø!Ð#5Ð6Ø!Ð#5Ð6Ø Ð0Ø'Ð)AÐBØ!Ð#5Ð6Ø Ð"3Ð4ð#ô
ó 
ñ	
ØØ!ØØØØØØ"ØØô" 	×Ñð
!ð  TÐ)Ø!¨Ð-Ø TÐ)ØØØØØ"¨$Ð.ØØô+	
ô0 )/«¯©Ó(8×f¡  1¸A¿L¹LÈÔ<PÐTUÐYeÓTe�q˜!‘tÐfˆÑfð ×0Ñ0Ø"ØØô
ð
 ×6Ñ6Ø÷ò óð ð ×(Ñ(¨Ô7Ø×6Ñ6Ø÷
ô 
óð ð ×+Ñ+Ð,<Ô=Ø&*×&AÑ&AÄ$ÄsÐL\ÓB]Ó&^Ñ#ˆK˜ØÐØ×7Ñ7ØØ!Øô
ð
 '+×&GÑ&GÜ"&¤sÐ,=Ó">Ü&*¬3Ð0EÓ&FÜ"&¤sÐ,=Ó">ð 'Hó 'Ñ#ˆK˜ð
 ÐØ×9Ñ9ØØ!Øô
ð
 ×6Ñ6Øöóð ð ×6Ñ6°t¸T×=UÑ=UÓVÐVùóS gs   Â	G Â(G Úmodelc                 óÚ   — 	 t        |t        «      rt        |«      sy |j                  d«      }t	        |«      dk  ry |d   }|sy t
        j                  |«      sy |S # t        $ r Y y w xY w)Nú:é   é   )Ú
isinstancer1   r   Úsplitrz   r!   ÚmatchÚ	Exception)rI   r²   ÚpartsÚregions       r4   Ú_get_aws_region_from_model_arnz)BaseAWSLLM._get_aws_region_from_model_arn]  ss   € ð	ä˜e¤SÔ)Ô1EÀeÔ1LØð !Ÿ;™; sÓ+ˆEÜ�5‹z˜AŠ~Øð " !™HˆFÙØä,×2Ñ2°6Ô:ØàˆMøÜò 	áð	ús'   ‚A žA ¾A ÁA ÁA Á	A*Á)A*Ú
model_pathc                 óŽ   — | j                  d«      }t        |«      dk\  r&|d   }|t        t        «      v rt	        t        |«      S y)at  
        Helper function to get the provider from a model path with format: provider/model-name

        Args:
            model_path (str): The model path (e.g., 'llama/arn:aws:bedrock:us-east-1:086734376398:imported-model/r4c4kewx2s0n' or 'anthropic/model-name')

        Returns:
            Optional[str]: The provider name, or None if no valid provider found
        ú/é   r   N)r¸   rz   r   r   r   )r¾   r»   Úproviders      r4   Ú_get_provider_from_model_pathz(BaseAWSLLM._get_provider_from_model_pathu  sG   € ð "×'Ñ'¨Ó,ˆÜˆu‹:˜Š?Ø# A™hˆHØœ8Ô$DÓEÑEÜÔ<¸hÓGÐGØr3   c                 ó†  — | j                  d«      r| j                  ddd«      } d| j                  «       v r!dt        t        «      v rt        t        d«      S | j                  d«      d   }|t        t        «      v rt        t        |«      S t        j                  | «      }|�|S t        t        «      D ]
  }|| v sŒ|c S  y)a¾  
        Helper function to get the bedrock provider from the model

        handles 3 scenarions:
        1. model=invoke/anthropic.claude-3-5-sonnet-20240620-v1:0 -> Returns `anthropic`
        2. model=anthropic.claude-3-5-sonnet-20240620-v1:0 -> Returns `anthropic`
        3. model=llama/arn:aws:bedrock:us-east-1:086734376398:imported-model/r4c4kewx2s0n -> Returns `llama`
        4. model=us.amazon.nova-pro-v1:0 -> Returns `nova`
        úinvoke/Ú rÁ   Únovaú.r   N)	r©   ÚreplaceÚlowerr   r   r   r¸   rN   rÃ   )r²   Ú_split_modelrÂ   s      r4   Úget_bedrock_invoke_providerz&BaseAWSLLM.get_bedrock_invoke_provider‰  sÃ   € ð ×Ñ˜IÔ&Ø—M‘M )¨R°Ó3ˆEð �U—[‘[“]Ñ"ØœÔ"BÓCÑCÜÔ<¸fÓEÐEà#Ÿk™k¨#Ó.¨qÑ1ˆØœ8Ô$DÓEÑEÜÔ8¸,ÓGÐGô ×;Ñ;¸EÓBˆØÐØˆOä Ô!AÓBò 	 ˆHØ˜5Ò Ø’ð	 ð r3   Úoptional_paramsrÂ   c                 ó@  — | j                  dd «      }|�t        j                  |¬«      }n9|}ddlm}  ||«      }|j                  d«      rt        j                  |¬«      }|S |j                  ddd«      }|d	k(  rd
|v rt        j                  |d	¬«      }|S |dk(  rd|v rt        j                  |d¬«      }|S |dk(  rd|v rt        j                  |d¬«      }|S |dk(  rd|v rt        j                  |d¬«      }|S |dk(  rd|v rt        j                  |d¬«      }|S |dk(  rd|v rt        j                  |d¬«      }|S |dk(  rd|v rt        j                  |d¬«      }|S d|v rt        j                  |d¬«      }|S d|v rt        j                  |d¬«      }|S )NÚmodel_id©rÏ   r   )Ústrip_bedrock_routing_prefixzarn:rÅ   rÆ   rÁ   Úllamazllama/)ÚspecÚdeepseek_r1zdeepseek_r1/Úopenaizopenai/Úqwen2zqwen2/Úqwen3zqwen3/Ú	stabilityz
stability/Úmoonshotz	moonshot/znova-2/znova-2znova/rÇ   )ÚpoprN   Úencode_model_idÚ!litellm.llms.bedrock.common_utilsrÑ   r©   rÉ   Ú"_get_model_id_from_model_with_spec)rÍ   rÂ   r²   rÏ   rÑ   s        r4   Úget_bedrock_model_idzBaseAWSLLM.get_bedrock_model_id­  s
  € ð #×&Ñ& z°4Ó8ˆØÐÜ!×1Ñ1¸8Ð1ÓD‰HàˆHõ Wá3°HÓ=ˆHà×"Ñ" 6Ô*Ü%×5Ñ5¸xÐ5ÓH�Ø�à×#Ñ# I¨r°1Ó5ˆØ�wÒ 8¨xÑ#7Ü!×DÑDÀXÐT[ÐDÓ\ˆHð" ˆð! ˜Ò&¨>¸XÑ+EÜ!×DÑDÀXÐTaÐDÓbˆHð ˆð ˜Ò! i°8Ñ&;Ü!×DÑDÀXÐT\ÐDÓ]ˆHð ˆð ˜Ò  X°Ñ%9Ü!×DÑDÀXÐT[ÐDÓ\ˆHð ˆð ˜Ò  X°Ñ%9Ü!×DÑDÀXÐT[ÐDÓ\ˆHð ˆð ˜Ò$¨¸Ñ)AÜ!×DÑDÀXÐT_ÐDÓ`ˆHð ˆð ˜Ò#¨°xÑ(?Ü!×DÑDÀXÐT^ÐDÓ_ˆHð
 ˆð	 ˜(Ñ"Ü!×DÑDÀXÐT\ÐDÓ]ˆHð ˆð ˜Ñ Ü!×DÑDÀXÐTZÐDÓ[ˆHØˆr3   rÓ   c                 óX   — | j                  |dz   d«      }t        j                  |¬«      S )zp
        Remove `llama` from modelID since `llama` is simply a spec to follow for custom bedrock models
        rÀ   rÆ   rÐ   )rÉ   rN   rÛ   )r²   rÓ   rÏ   s      r4   rÝ   z-BaseAWSLLM._get_model_id_from_model_with_specà  s,   € ð  Ÿ-™-¨¨s©
°BÓ7ˆÜ×)Ñ)°8Ð)Ó<Ð<r3   rÏ   c                 óD   — t         j                  j                  | d¬«      S )zæ
        Double encode the model ID to ensure it matches the expected double-encoded format.
        Args:
            model_id (str): The model ID to encode.
        Returns:
            str: The double-encoded model ID.
        rÆ   )Úsafe)ÚurllibÚparseÚquoterÐ   s    r4   rÛ   zBaseAWSLLM.encode_model_idë  s   € ô �|‰|×!Ñ! (°Ð!Ó4Ð4r3   c                 óœ  — d| j                  «       v r!dt        t        «      v rt        t        d«      S d| v rk| j	                  d«      }t        |«      dk\  r&|d   }|t        t        «      v rt        t        |«      S |d   }|t        t        «      v rt        t        |«      S t        t        «      D ]  }|| v sŒt        t        |«      c S  y)aÛ  
        Helper function to get the bedrock embedding provider from the model

        Handles scenarios like:
        1. model=cohere.embed-english-v3:0 -> Returns `cohere`
        2. model=amazon.titan-embed-text-v1 -> Returns `amazon`
        3. model=amazon.nova-2-multimodal-embeddings-v1:0 -> Returns `nova`
        4. model=us.twelvelabs.marengo-embed-2-7-v1:0 -> Returns `twelvelabs`
        5. model=twelvelabs.marengo-embed-2-7-v1:0 -> Returns `twelvelabs`
        rÇ   rÈ   é   rÁ   r   N)rÊ   r   r   r   r¸   rz   )r²   r»   Úpotential_providerrÂ   s       r4   Úget_bedrock_embedding_providerz)BaseAWSLLM.get_bedrock_embedding_providerö  sÔ   € ð  �U—[‘[“]Ñ"ØœÔ"EÓFÑFÜÔ?ÀÓHÐHð �%‰<Ø Ÿ;™; sÓ+ˆEä�5‹z˜QŠØ%*¨1¡XÐ"Ø%¬Ô2UÓ)VÑVÜÔ CÐEWÓXÐXð "' q¡ÐØ!¤XÔ.QÓ%RÑRÜÔ?ÐASÓTÐTô !Ô!DÓEò 	KˆHØ˜5Ò ÜÔ?ÀÓJÒJð	Kð r3   c                 ó  — |j                  dd«      }| j                  |«       |€i|�| j                  |«      }n| j                  |«      }t        dd«      }|€|�t	        |t
        «      r|}t        dd«      }|€|�t	        |t
        «      r|}|€F	 ddl}t        j                  d«      5  |j                  «       }ddd«       j                  }	|	r|	}nd}| j                  |«       |S # 1 sw Y   Œ/xY w# t        $ r d}Y Œ,w xY w)ar  
        Get the AWS region name from the environment variables.

        Parameters:
            optional_params (dict): Optional parameters for the model call
            model (str): The model name
            model_id (str): The model ID. This is the ARN of the model, if passed in as a separate param.

        Returns:
            str: The AWS region name
        r+   Nr•   Ú
AWS_REGIONr   úboto3.Session()ú	us-west-2)ÚgetÚ_validate_aws_region_namer½   r   r·   r1   Úboto3r   ÚtraceÚSessionÚregion_namerº   )
rI   rÍ   r²   rÏ   r+   Úlitellm_aws_region_nameÚstandard_aws_region_namerï   ÚsessionÚconfigured_regions
             r4   Ú_get_aws_region_namezBaseAWSLLM._get_aws_region_name  s%  € ð" *×-Ñ-Ð.?ÀÓFˆØ×&Ñ& Ô7àÐ"àÐ#Ø"&×"EÑ"EÀhÓ"O‘à"&×"EÑ"EÀeÓ"L�ä-7Ð8IÈ4Ó-PÐ#ð  Ð'Ø+Ð7ÜÐ6¼Ô<à"9�ä.8¸ÀtÓ.LÐ$àÐ'Ø,Ð8ÜÐ7¼Ô=à":�ØÐ"ð.Ûä—\‘\Ð"3Ó4ñ 5Ø%*§]¡]£_�G÷5à+2×+>Ñ+>Ð!Ù$Ø&7‘Oà&1�Oð 	×&Ñ& Ô7ØÐ÷5ð 5ûô ò .Ø"-’ð.ús*   ÂC6 Â+C*Â<C6 Ã*C3Ã/C6 Ã6DÄDc                 ór   — | €yt        | t        «      rt        j                  | «      st	        d| ›d�«      ‚y)zž
        Validate that an AWS region name conforms to the expected format
        (lowercase alphanumerics and hyphens). Raises ValueError otherwise.
        NzInvalid AWS region format: zH. Region names must contain only lowercase letters, digits, and hyphens.)r·   r1   r!   r¹   Ú
ValueError)r+   s    r4   rî   z$BaseAWSLLM._validate_aws_region_name[  sN   € ð Ð"ØÜ˜/¬3Ô/Ô7P×7VÑ7VÐWfÔ7gÜØ-¨oÐ-@ð AYð Yóð ð 8hr3   c                 ó¶   — | syt         j                  j                  | «      j                  xs d}t        j                  |«      }|r|j                  d«      S dS )zYExtract region from sts.{region}.amazonaws.com or vpce-x.sts.{region}.vpce.amazonaws.com.NrÆ   rÁ   )râ   rã   ÚurlparseÚhostnamer"   ÚsearchÚgroup)ra   Úhostr¹   s      r4   Ú_parse_sts_region_from_endpointz*BaseAWSLLM._parse_sts_region_from_endpointi  sO   € ñ
  ØÜ—l‘l×+Ñ+Ð,<Ó=×FÑFÒLÈ"ˆÜ8×?Ñ?ÀÓEˆÙ!&ˆu�{‰{˜1‹~Ð0¨DÐ0r3   c                 ó�   — t         j                  | «      xs0 t        j                  d«      xs t        j                  d«      xs |S )z|STS signing region: parsed from aws_sts_endpoint, else AWS_REGION / AWS_DEFAULT_REGION, else the configured aws_region_name.rê   ÚAWS_DEFAULT_REGION)rN   r   rŽ   r�   )ra   r+   s     r4   Ú_resolve_sts_regionzBaseAWSLLM._resolve_sts_regiont  sE   € ô ×6Ñ6Ð7GÓHò Ü�y‰y˜Ó&òä�y‰yÐ-Ó.òð ð		
r3   c                 ól   — d| j                  |«      i}|�||d<   | j                  ||«      }|�||d<   |S )zDSTS client kwargs with aligned endpoint_url and region_name (SigV4).ÚverifyÚendpoint_urlrò   )rj   r  )rI   ra   re   r+   ÚkwargsÚ
sts_regions         r4   Ú_build_sts_client_kwargsz#BaseAWSLLM._build_sts_client_kwargs�  sQ   € ð  (¨×)=Ñ)=¸jÓ)IÐJˆØÐ'Ø%5ˆF�>Ñ"Ø ×4Ñ4Ð5EÀÓWˆ
ØÐ!Ø$.ˆF�=Ñ!Øˆr3   c                 óÖ   — | j                  |«       |€Dt        dd«      }|�t        |t        «      r|}t        dd«      }|�t        |t        «      r|}|€d}| j                  |«       |S )a  
        Get the AWS region name for non-llm api calls.

        LLM API calls check the model arn and end up using that as the region name.

        For non-llm api calls eg. Guardrails, Vector Stores we just need to check the dynamic param or env vars.
        Nr•   rê   rì   )rî   r   r·   r1   )rI   r+   ró   rô   s       r4   Ú)get_aws_region_name_for_non_llm_api_callsz4BaseAWSLLM.get_aws_region_name_for_non_llm_api_calls�  s~   € ð 	×&Ñ& Ô7ØÐ"ä-7Ð8IÈ4Ó-PÐ#à&Ð2´zÐBYÔ[^Ô7_Ø"9�ä.8¸ÀtÓ.LÐ$Ø'Ð3¼
ÐC[Ô]`Ô8aØ":�àÐ&Ø"-�à×&Ñ& Ô7ØÐr3   Úarnc                 óT  — | j                  d«      }t        |«      dk  s|d   dk7  ry|d   }|d   }dj                  |dd «      }|j                  d	«      r|j                  d
«      d   }n8|j                  d«      r&|j                  d
«      }t        |«      dk\  r|d   }nyy|||fS )a?  
        Parse an ARN and return (partition, account_id, role_name).

        Handles:
        - arn:aws:iam::123456789012:role/MyRole
        - arn:aws:iam::123456789012:role/path/to/MyRole
        - arn:aws:sts::123456789012:assumed-role/MyRole/session-name

        Returns None if the ARN cannot be parsed.
        r´   é   r   r  NrÁ   rµ   é   zrole/rÀ   éÿÿÿÿzassumed-role/ræ   )r¸   rz   Újoinr©   )r  r»   Ú	partitionÚ
account_idÚresourceÚ	role_nameÚ
role_partss          r4   Ú _parse_arn_account_and_role_namez+BaseAWSLLM._parse_arn_account_and_role_name­  sµ   € ð —y‘y “~ˆÜˆu‹:˜Š>˜U 1™X¨Ò.Øà  ™8ˆ	Ø! !™Hˆ
ØŸ(™( 5¨¨ 9Ó-ˆà×Ñ˜wÔ'à Ÿ™ sÓ+¨BÑ/‰IØ× Ñ  Ô1à (§¡¨sÓ 3ˆJÜ�:‹ !Ò#Ø& q™M‘	ààà˜* iÐ/Ð/r3   c                 ól  — | j                  |«      }|€y|\  }}}t        j                  d«      }t        j                  d«      }|r|r||k(  S 	 ddl}	t	        j
                  d«      5  |	j                  d| j                  |«      ¬«      }
|
j                  «       }|j                  d	d
«      }ddd«       | j                  «      }|�,|\  }}}||k(  r!||k(  r||k(  rt        j                  d|«       yy# 1 sw Y   ŒIxY w# t        $ r)}t        j                  dt        |«      «       Y d}~yd}~ww xY w)ay  
        Check if the current environment is already running as the target IAM role.

        This handles multiple AWS environments:
        - IRSA (EKS): AWS_ROLE_ARN + AWS_WEB_IDENTITY_TOKEN_FILE are set
        - ECS task roles: Uses sts:GetCallerIdentity to check current role ARN
        - EC2 instance profiles: Uses sts:GetCallerIdentity to check current role ARN

        Compares partition, account ID, and role name to avoid cross-account
        false matches.

        Returns True if the current identity matches the target role, meaning
        we can skip sts:AssumeRole and use ambient credentials directly.
        NFÚAWS_ROLE_ARNÚAWS_WEB_IDENTITY_TOKEN_FILEr   z%boto3.client(sts).get_caller_identityÚsts)r  ÚArnrÆ   z0Current identity already matches target role: %sTz-Could not determine current role identity: %s)r  rŽ   r�   rï   r   rð   Úclientrj   Úget_caller_identityrí   r   r¦   rº   r1   )rI   r_   re   Útarget_parsedÚtarget_partitionÚtarget_accountÚtarget_roleÚcurrent_role_arnÚweb_identity_token_filerï   Ú
sts_clientÚidentityÚ
caller_arnÚcaller_parsedÚcaller_partitionÚcaller_accountÚcaller_roleÚes                     r4   Ú_is_already_running_as_rolez&BaseAWSLLM._is_already_running_as_roleÓ  sP  € ð&  $×DÑDÀ]ÓSˆØÐ Øà8EÑ5Ð˜.¨+ô #%§)¡)¨NÓ";ÐÜ)+¯©Ð3PÓ)QÐÙÑ 7Ø# }Ñ4Ð4ð	ZÛä—‘ÐEÓFñ <Ø$)§L¡L°¸t×?SÑ?SÐT^Ó?_ LÓ$`�
Ø",×"@Ñ"@Ó"B�Ø$,§L¡L°¸Ó$;�
÷<ð
 $(×#HÑ#HÈÓ#TˆMØÐ(Ø@MÑ=Ð  .°+à$Ð(8Ò8Ø&¨.Ò8Ø# {Ò2ä"×(Ñ(ØJØ%ôð  ð
 ÷-<ð <ûô& ò 	ZÜ× Ñ Ð!PÔRUÐVWÓRX×YÐYàûð	Zús2   ÁD Á(AC5Â-AD Ã5C>Ã:D Ä	D3Ä
D.Ä.D3Ú
oidc_tokenc                 ó\  — | j                  d«      }t        |«      dk7  ry|d   }	 t        j                  |dt        |«       dz  z  z   «      }t        j                  |«      }|j                  €|j                  €yd|j                  ›d|j                  ›�S # t        t        f$ r Y yw xY w)	zôReturn the public ``aud``/``iss`` claims of a web identity JWT
        without verifying its signature, so a rejected-token error can name
        the audience LiteLLM actually sent. The signature is never read, so no
        secret is exposed.rÈ   r¶   NrÁ   ú=rµ   zaud=z, iss=)
r¸   rz   Úbase64Úurlsafe_b64decoder6   Úmodel_validate_jsonrù   r   r7   r8   )r.  ÚsegmentsÚpayloadÚdecodedÚclaimss        r4   Ú!_unverified_web_identity_audiencez,BaseAWSLLM._unverified_web_identity_audience  s³   € ð %×*Ñ*¨3Ó/ˆÜˆx‹=˜AÒØØ! !™ˆð	Ü#×5Ñ5°gÀÌÈGËÀ}ÐWXÑGXÑ@YÑ6YÓZˆGÜ3×GÑGÈÓPˆFð �:‰:Ð &§*¡*Ð"4ØØ�f—j‘j�^ 6¨&¯*©*¨Ð8Ð8øô	 œOÐ,ò 	Ùð	ús   §=B ÂB+Â*B+c           
      ó,  — ddl }t        j                  d|||«       |j                  d«      s|t        j
                  v rt        dd¬«      ‚t        |«      }	|	€t        dd	¬«      ‚| j                  |||¬
«      }
t        j                  d«      5   |j                  d,i |
¤Ž}ddd«       dddg d¢ddddiidœddg d¢ddddiidœdddgddddiidœgdœ}|||	dt        j                  |d¬«      dœ}|�||d<   	  j                  d-i |¤Ž}|d$   d%   |d$   d&   |d$   d'   |d(œ}|d)   t(        kD  rt        j*                  d*|d)   «       t        j                  d+«      5   |j,                  d-i |¤Ž}ddd«       j/                  «       }|| j1                  «       fS # 1 sw Y   ŒûxY w# j                  j                   $ rE}t#        |	t$        «      r| j'                  |	«      nd}|rd|› �nd }t        d	d!|› d"|› �¬#«      |‚d}~ww xY w# 1 sw Y   Œ˜xY w).z:
        Authenticate with AWS Web Identity Token
        r   Nz<IN Web Identity Token: %s | Role Name: %s | Session Name: %szos.environ/z%Invalid web identity token reference.i�  )rB   r@   z6OIDC token could not be retrieved from secret manager.i‘  ©ra   re   r+   úboto3.client(sts)z
2012-10-17ÚBedrockLiteLLMÚAllow)zbedrock:InvokeModelz%bedrock:InvokeModelWithResponseStreamzbedrock:CountTokenszbedrock:ApplyGuardrailzbedrock:GetGuardrailzbedrock:ListGuardrailsÚ*ÚBoolzaws:SecureTransportÚtrue)ÚSidÚEffectÚActionÚResourceÚ	ConditionÚClaudePlatformLiteLLM)z&aws-external-anthropic:CreateInferencez+aws-external-anthropic:CreateBatchInferencez+aws-external-anthropic:CancelBatchInferencez+aws-external-anthropic:DeleteBatchInferencez"aws-external-anthropic:CountTokenszaws-external-anthropic:Get*zaws-external-anthropic:List*ÚBedrockMantleLiteLLMzbedrock-mantle:CreateInference)ÚVersionÚ	Statementi  )ú,r´   )Ú
separators)ÚRoleArnÚRoleSessionNameÚWebIdentityTokenÚDurationSecondsÚPolicyÚ
ExternalIdz Token rÆ   z)AWS STS rejected the web identity token: rÈ   )r@   rB   r    ÚAccessKeyIdÚSecretAccessKeyÚSessionToken)rZ   r[   r\   rò   ÚPackedPolicySizezNThe policy size is greater than 75%% of the allowed size, PackedPolicySize: %szboto3.Session(**iam_creds_dict)©r  r2   )rï   r   r¦   r©   rŽ   Úenvironr;   r   r	  r   rð   r  rn   ro   Úassume_role_with_web_identityÚ
exceptionsÚInvalidIdentityTokenExceptionr·   r1   r8  r   Úwarningrñ   r±   Ú&_get_default_ttl_for_boto3_credentials)rI   r`   r_   r]   r+   ra   rb   re   rï   r.  Ústs_client_kwargsr%  Úbedrock_session_policyÚassume_role_paramsÚsts_responser,  ÚaudienceÚdetailÚiam_creds_dictrõ   Ú	iam_credss                        r4   rž   z(BaseAWSLLM._auth_with_web_identity_token!  sÜ  € ó 	ä×ÑØJØ"ØØô		
ð "×,Ñ,¨]Ô;Ð?UÔY[×YcÑYcÑ?cÜØ?Øôð ô
 'Ð'=Ó>ˆ
àÐÜØPØôð ð
 $(×#@Ñ#@Ø-Ø!Ø+ð $Aó $
Ðô �\‰\Ð-Ó.ñ 	IØ , §¡Ñ HÐ6GÑ HˆJ÷	Ið $ð ,Ø%òð !$Ø"(Ð+@À&Ð*IÐ!Jñð( 3Ø%òð !$Ø"(Ð+@À&Ð*IÐ!Jñð  2Ø%à8ðð !$Ø"(Ð+@À&Ð*IÐ!JñðG,ñ/)
Ððb %Ø/Ø *Ø#Ü—j‘jÐ!7ÀJÔOñ%
Ðð Ð&Ø/>Ð˜|Ñ,ð	Ø"J *×"JÑ"JÑ"`ÐM_Ñ"`ˆLð ".¨mÑ!<¸]Ñ!KØ%1°-Ñ%@ÐARÑ%SØ!-¨mÑ!<¸^Ñ!LØ*ñ	!
ˆð Ð*Ñ+Ô.EÒEÜ×"Ñ"Ø`ØÐ/Ñ0ôô
 �\‰\Ð;Ó<ñ 	=Ø*˜UŸ]™]Ñ<¨^Ñ<ˆG÷	=ð #×2Ñ2Ó4ˆ	Ø˜$×EÑEÓGÐGÐG÷E	Ið 	IûðR ×$Ñ$×BÑBò 	ÜMWÐXbÔdgÔMh�t×=Ñ=¸jÔIÐnrˆHÙ4<˜g h ZÑ0À"ˆFÜØØCÀAÀ3ÀaÈÀxÐPôð ðûð	ú÷*	=ð 	=ús1   ÂFÃ;F) Å H
ÆF&Æ)HÇA HÈHÈ
HÚirsa_role_arnr$  c	                 óx  — ddl }	t        j                  d«       t        |d«      5 }
|
j	                  «       j                  «       }ddd«       | j                  |||¬«      }t        j                  d«      5   |	j                  di |¤Ž}ddd«       t        j                  d||«       j                  ||¬«      }|d	   }t        j                  d
«      5   |	j                  	 d|d   |d   |d   dœ|¤Ž}ddd«       	 j                  «       }t        j                  d|j                  dd«      «       t        j                  d||«       ||dœ}|�||d<    j                  di |¤ŽS # 1 sw Y   �Œ(xY w# 1 sw Y   ŒðxY w# 1 sw Y   ŒŽxY w# t        $ r }t        j                  d|«       Y d}~Œ~d}~ww xY w)z.Handle cross-account role assumption for IRSA.r   Nz&Cross-account role assumption detectedÚrr:  z!boto3.client(sts) for manual IRSAz.Manually assuming IRSA role %s with session %s)rL  rM  rN  r    z.boto3.client(sts) with manual IRSA credentialsrR  rS  rT  r‡   z1Current identity after manual IRSA assumption: %sr  Úunknownú!Failed to get caller identity: %sz5Attempting to assume target role: %s with session: %s©rL  rM  rQ  rV  r2   )rï   r   r¦   ÚopenÚreadÚstripr	  r   rð   r  rX  r  rí   rº   Úassume_role)rI   re  r_   r]   r$  rb   ra   re   r+   rï   ÚfÚweb_identity_tokenÚirsa_sts_kwargsr%  Úirsa_responseÚ
irsa_credsÚsts_client_with_credsÚcaller_identityr,  r_  s                       r4   Ú_handle_irsa_cross_accountz%BaseAWSLLM._handle_irsa_cross_accountµ  s÷  € ó 	ä×ÑÐEÔFô Ð)¨3Ó/ð 	9°1Ø()¯©«¯©Ó(8Ð÷	9ð "&×!>Ñ!>Ø-Ø!Ø+ð "?ó "
ˆô �\‰\Ð=Ó>ñ 	GØ , §¡Ñ F°oÑ FˆJ÷	Gô 	×ÑÐMÈ}Ð^nÔoØ)×GÑGØ!Ø,Ø/ð  Hó  
ˆð *¨-Ñ8ˆ
ô �\‰\ÐJÓKñ 	Ø+7¨5¯<©<Øð,à",¨]Ñ";Ø&0Ð1BÑ&CØ",¨^Ñ"<ñ	,ð
 "ñ,Ð!÷	ð	IØ%:×%NÑ%NÓ%PˆOÜ× Ñ ØCÀ_×EXÑEXÐY^Ð`iÓEjôô 	×ÑÐTÐVcÐeuÔvà$Ø/ñ%
Ðð Ð&Ø/>Ð˜|Ñ,à0Ð$×0Ñ0ÑFÐ3EÑFÐF÷m	9ñ 	9ú÷	Gð 	Gú÷	ð 	ûô ò 	IÜ× Ñ Ð!DÀa×HÑHûð	Iús;   ¦E+Á6E8Ã!FÄ 6F Å+E5Å8FÆFÆ	F9ÆF4Æ4F9c                 ó  — ddl }| j                  |||¬«      }t        j                  d«       t	        j
                  d«      5   |j                  di |¤Ž}	ddd«       	 	j                  «       }
t        j                  d|
j                  dd«      «       t        j                  d
||«       ||dœ}|�||d<    	j                  di |¤ŽS # 1 sw Y   ŒuxY w# t        $ r }t        j                  d	|«       Y d}~Œed}~ww xY w)z-Handle same-account role assumption for IRSA.r   Nr:  z2Same account role assumption, using automatic IRSAz%boto3.client(sts) with automatic IRSAzCurrent IRSA identity: %sr  rh  ri  z.Attempting to assume role: %s with session: %srj  rQ  rV  r2   )rï   r	  r   r¦   r   rð   r  r  rí   rº   rn  )rI   r_   r]   rb   ra   re   r+   rï   rq  r%  ru  r,  r_  s                r4   Ú_handle_irsa_same_accountz$BaseAWSLLM._handle_irsa_same_accountþ  s  € ó 	à!%×!>Ñ!>Ø-Ø!Ø+ð "?ó "
ˆô 	×ÑÐQÔRÜ�\‰\ÐAÓBñ 	GØ , §¡Ñ F°oÑ FˆJ÷	Gð	IØ%/×%CÑ%CÓ%EˆOÜ× Ñ Ð!<¸o×>QÑ>QÐRWÐYbÓ>cÔdô
 	×ÑÐMÈ}Ð^nÔoà$Ø/ñ%
Ðð Ð&Ø/>Ð˜|Ñ,à%ˆz×%Ñ%Ñ;Ð(:Ñ;Ð;÷+	Gð 	Gûô ò 	IÜ× Ñ Ð!DÀa×HÑHûð	Iús$   ÁC
Á6C Ã
CÃ	C?ÃC:Ã:C?r`  c                 óÒ   — ddl m} |d   } ||d   |d   |d   ¬«      }|d   }t        |t        j                  |j
                  «      z
  j                  «       t        z
  «      }||fS )	zÝExtract credentials and TTL from STS response.

        The TTL carries the same safety margin as the non-IRSA assume path, so a cached entry is
        never handed out close enough to expiry to die mid-request.
        r   r   r    rR  rS  rT  ©Ú
access_keyÚ
secret_keyÚtokenÚ
Expiration)Úbotocore.credentialsr    Úintr   ÚnowÚtzinfoÚtotal_secondsr   )rI   r`  r    Ústs_credentialsr*   Úexpiration_timerx   s          r4   Ú_extract_credentials_and_ttlz'BaseAWSLLM._extract_credentials_and_ttl(  s   € õ 	5à!-¨mÑ!<ˆÙ(Ø& }Ñ5Ø&Ð'8Ñ9Ø! .Ñ1ô
ˆð "1°Ñ!>ˆÜØœxŸ|™|¨O×,BÑ,BÓCÑC×RÑRÓTÜ9ñ:ó
ˆð
 ˜CÐÐr3   c
                 ó2  — | j                  ||	¬«      r&t        j                  d|«       | j                  «       S t        j                  d«       | j	                  |||||xs. dt        t        j                  «       j                  «       «      › �||||	¬«	      S )a™  
        Resolve credentials for a target role, either from the ambient identity or via sts:AssumeRole.

        Both the ``sts:GetCallerIdentity`` probe and the assume itself run here, so a cache hit on the
        caller's key skips both. ``aws_session_name`` defaults inside this fetcher rather than in
        ``get_credentials`` so the cache key stays stable when the caller does not supply one.
        rh   z<Already running as target role %s, using ambient credentialsz2Using role assumption: calling _auth_with_aws_rolezlitellm-session-r¡   )	r-  r   r¦   r¬   Ú_auth_with_aws_roler€  r   r�  Ú	timestamp)
rI   rZ   r[   r\   r_   r]   r+   ra   rb   re   s
             r4   r¢   z$BaseAWSLLM._resolve_role_credentials?  s    € ð& ×+Ñ+¨MÀjÐ+ÔQÜ× Ñ ØNØôð ×+Ñ+Ó-Ð-ä×ÑÐQÔRØ×'Ñ'Ø/Ø"7Ø/Ø'Ø-ÒeÐ3CÄCÌÏÉË×H`ÑH`ÓHbÓDcÐCdÐ1eØ+Ø-Ø+Ø!ð (ó 

ð 
	
r3   c
           
      óö  — ddl }
ddlm} t        j                  d«      }t        j                  d«      }|rd|rb|€`|€^t        j                  d|«       	 ||k7  r| j                  |||||||	|¬«      }n| j                  |||||	|¬«      }| j                  |«      S | j                  ||	|¬«      }|€3|€1t        j                  d«      5   |
j                   di |¤Ž}ddd«       n5t        j                  d«      5   |
j                   	 d|||dœ|¤Ž}ddd«       ||dœ}|�||d<   	  j"                  di |¤Ž}|d   } ||d   |d   |d   ¬«      }|d   }t+        j,                  |j.                  «      }||z
  j1                  «       t2        z
  }||fS # t        $ rM}t        j                  d|«       d	t        |«      v r$d
t        |«      v rt        j                  d||«       ‚ d}~ww xY w# 1 sw Y   ŒÜxY w# 1 sw Y   ŒèxY w# t        $ rk}t        |«      }d	|v rV| j%                  ||	¬«      r,t        j&                  d||«       | j)                  «       cY d}~S t        j                  d||«       ‚ d}~ww xY w)z,
        Authenticate with AWS Role
        r   Nr   r  r  z/IRSA detected: using web identity token from %sr:  z"Failed to assume role via IRSA: %sÚAccessDeniedz,is not authorized to perform: sts:AssumeRolez§Access denied when trying to assume role %s. Please ensure the trust policy of %s allows the current role to assume it. Current identity: check logs with verbose mode.r;  r‡   rj  rQ  rh   zkAssumeRole failed for %s (%s). Caller is already running as this role; falling back to ambient credentials.zUAssumeRole AccessDenied for %s and caller is NOT the same role. Re-raising. Error: %sr    rR  rS  rT  rz  r~  rV  r2   )rï   r  r    rŽ   r�   r   r¦   rv  rx  r†  rº   r1   Úerrorr	  r   rð   r  rn  r-  r[  r¬   r   r�  r‚  rƒ  r   )rI   rZ   r[   r\   r_   r]   r+   ra   rb   re   rï   r    r$  re  r`  r,  r]  r%  r_  Ú	error_strr„  r*   Ú
sts_expiryÚcurrent_timeÚsts_ttls                            r4   rˆ  zBaseAWSLLM._auth_with_aws_rolef  s  € ó  	Ý4ô *,¯©Ð3PÓ)QÐÜ!Ÿy™y¨Ó8ˆñ #¡}Ð9JÐ9RÐWlÐWtô × Ñ Ð!RÐTkÔlð#à  MÒ1Ø#'×#BÑ#BØ%Ø%Ø(Ø/Ø'Ø)9Ø#-Ø(7ð $Có 	$‘Lð $(×#AÑ#AØ%Ø(Ø'Ø)9Ø#-Ø(7ð $Bó $�Lð ×8Ñ8¸ÓFÐFð  $(×#@Ñ#@Ø-Ø!Ø+ð $Aó $
Ðð
 Ð$Ð)>Ð)FÜ—‘Ð1Ó2ñ FØ)˜UŸ\™\ÑEÐ3DÑE�
÷Fð Fô —‘Ð1Ó2ñ Ø)˜UŸ\™\Øðà&7Ø*?Ø&7ñ	ð
 (ñ�
÷ð %Ø/ñ%
Ðð Ð&Ø/>Ð˜|Ñ,ð	Ø1˜:×1Ñ1ÑGÐ4FÑGˆLð6 ".¨mÑ!<ˆÙ(Ø& }Ñ5Ø&Ð'8Ñ9Ø! .Ñ1ô
ˆð ,¨LÑ9ˆ
ä&Ÿl™l¨:×+<Ñ+<Ó=ˆØ$ |Ñ3×BÑBÓDÔGrÑrˆØ˜GÐ#Ð#øôa ò 
Ü×$Ñ$Ð%IÈ1ÔMØ!¤S¨£VÑ+Ð0^ÔbeÐfgÓbhÑ0hä"×(Ñ(ð BØ%Ø%ôð ûð
ú÷(Fð Fú÷ð ûô( ò 	Ü" 1›vˆIØ Ñ*ð ×3Ñ3°MÈjÐ3ÔYÜ"×*Ñ*ð?ð &Ø!ôð  ×3Ñ3Ó5Õ5ä×$Ñ$ØkØ!Øôð
 ûð/	úsW   ÁAF ÃG,Ã9G8Ä&H Æ	G)ÆAG$Ç$G)Ç,G5Ç8HÈ	I8ÈAI3ÉI8ÉI3É3I8c                 ó¨   — ddl }t        j                  d«      5  |j                  |¬«      }|j	                  «       dfcddd«       S # 1 sw Y   yxY w)z/
        Authenticate with AWS profile
        r   Nz,boto3.Session(profile_name=aws_profile_name))Úprofile_name©rï   r   rð   rñ   r±   )rI   r^   rï   r  s       r4   rª   z!BaseAWSLLM._auth_with_aws_profileï  sM   € ó
 	ô �\‰\ÐHÓIñ 	2Ø!ŸM™MÐ7G˜MÓHˆFØ×)Ñ)Ó+¨TÐ1÷	2÷ 	2ò 	2úó   š$AÁAc                 ó,   — ddl m}  ||||¬«      }|dfS )z5
        Authenticate with AWS Session Token
        r   r   rz  N)r  r    )rI   rZ   r[   r\   r    r*   s         r4   r«   z'BaseAWSLLM._auth_with_aws_session_tokenû  s'   € õ 	5á(Ø(Ø,Ø#ô
ˆð ˜DÐ Ð r3   c                 óÊ   — ddl }t        j                  d«      5  |j                  |||¬«      }ddd«       j	                  «       }|| j                  «       fS # 1 sw Y   Œ+xY w)zA
        Authenticate with AWS Access Key and Secret Key
        r   Nz|boto3.Session(aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, region_name=aws_region_name))rZ   r[   rò   )rï   r   rð   rñ   r±   r\  )rI   rZ   r[   r+   rï   rõ   r*   s          r4   r¤   z/BaseAWSLLM._auth_with_access_key_and_secret_key  sr   € ó 	ô �\‰\ð Kó
ñ 	ð #Ÿ]™]Ø"3Ø&;Ø+ð +ó ˆG÷	ð %×4Ñ4Ó6ˆØ˜D×GÑGÓIÐIÐI÷	ð 	ús   šAÁA"c                 ó¨   — ddl }t        j                  d«      5  |j                  «       }|j	                  «       }|dfcddd«       S # 1 sw Y   yxY w)z=
        Authenticate with AWS Environment Variables
        r   Nrë   r“  )rI   rï   rõ   r*   s       r4   r¬   zBaseAWSLLM._auth_with_env_vars)  sJ   € ó
 	ä�\‰\Ð+Ó,ñ 	%Ø"Ÿ]™]›_ˆGØ!(×!8Ñ!8Ó!:ˆKØ Ð$÷	%÷ 	%ò 	%úr”  c                  ó   — y)zj
        Get the default TTL for boto3 credentials

        Returns `3600-60` which is 59 minutes
        iÔ  r2   )rI   s    r4   r\  z1BaseAWSLLM._get_default_ttl_for_boto3_credentials5  s   € ð r3   Úapi_baser,   Úendpoint_type)ÚruntimeÚagentÚ	agentcorec                 ó  — t        d«      }|�|}n=|�t        |t        «      r|}n(|rt        |t        «      r|}n| j                  ||¬«      }|�t        |t        «      r|}||fS |rt        |t        «      r|}||fS |}||fS )NÚAWS_BEDROCK_RUNTIME_ENDPOINT)rš  r+   )r   r·   r1   Ú_select_default_endpoint_url)rI   r™  r,   r+   rš  Ú env_aws_bedrock_runtime_endpointr  Úproxy_endpoint_urls           r4   Úget_runtime_endpointzBaseAWSLLM.get_runtime_endpoint>  s¾   € ô 3=Ð=[Ó2\Ð(ØÐØ#‰LØ)Ð5¼*ÐEaÔcfÔ:gØ7‰LÙ-´*Ð=]Ô_bÔ2cØ;‰Là×<Ñ<Ø+Ø /ð =ó ˆLð (Ð3¼
ÐC_ÔadÔ8eØ!=Ðð Ð/Ð/Ð/ñ .´*Ð=]Ô_bÔ2cØ!AÐð Ð/Ð/Ð/ð ".ÐàÐ/Ð/Ð/r3   c                 ó\   — t        |«      }|dk(  rd|› d|› �S |dk(  rd|› d|› �S d|› d|› �S )z®
        Select the default endpoint url based on the endpoint type

        Default endpoint url is https://bedrock-runtime.{aws_region_name}.{partition dns suffix}
        rœ  zhttps://bedrock-agent-runtime.rÈ   r�  zhttps://bedrock-agentcore.zhttps://bedrock-runtime.)r   )rI   rš  r+   Ú
dns_suffixs       r4   r   z'BaseAWSLLM._select_default_endpoint_url\  sZ   € ô /¨Ó?ˆ
Ø˜GÒ#Ø3°OÐ3DÀAÀjÀ\ÐRÐRØ˜kÒ)Ø/°Ð/@ÀÀ*ÀÐNÐNà-¨oÐ->¸aÀ
¸|ÐLÐLr3   c                 óB  — 	 ddl m} |j                  dd«      }|j                  dd«      }|j                  dd«      }| j	                  ||«      }|j                  dd«       |j                  d	d«      }|j                  d
d«      }	|j                  dd«      }
|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }| j                  |||||	|
||||¬«
      }t        |||¬«      S # t        $ r t        d«      ‚w xY w)zÚ
        Get boto3 credentials from optional params

        Args:
            optional_params (dict): Optional parameters for the model call

        Returns:
            Credentials: Boto3 credentials object
        r   r   ú7Missing boto3 to call bedrock. Run 'pip install boto3'.r[   NrZ   r\   r+   r_   r]   r^   r`   ra   r,   rb   ©
rZ   r[   r\   r+   r]   r^   r_   r`   ra   rb   )r*   r+   r,   )r  r    ÚImportErrorrÚ   r÷   r±   r)   )rI   rÍ   r²   r    r[   rZ   r\   r+   r_   r]   r^   r`   ra   r,   rb   r*   s                   r4   Ú*_get_boto_credentials_from_optional_paramsz5BaseAWSLLM._get_boto_credentials_from_optional_paramsn  sf  € ð	YÝ8ð
 (7×':Ñ':Ð;RÐTXÓ'YÐØ#2×#6Ñ#6Ð7JÈDÓ#QÐØ#2×#6Ñ#6Ð7JÈDÓ#QÐØ!%×!:Ñ!:¸?ÈEÓ!RˆØ×ÑÐ-¨tÔ4Ø.×2Ñ2°?ÀDÓIˆØ"1×"5Ñ"5Ð6HÈ$Ó"OÐØ"1×"5Ñ"5Ð6HÈ$Ó"OÐØ(7×(;Ñ(;Ð<TÐVZÓ([ÐØ"1×"5Ñ"5Ð6HÈ$Ó"OÐØ.=×.AÑ.AØ*¨Dó/
Ð$ð "1×!4Ñ!4Ð5FÈÓ!Mˆà*.×*>Ñ*>Ø/Ø"7Ø/Ø+Ø-Ø-Ø'Ø#9Ø-Ø+ð +?ó +
ˆô $Ø#Ø+Ø)Eô
ð 	
øôA ò 	YÜÐWÓXÐXð	Yús   ‚D	 Ä	Dr*   Úextra_headersr  ÚdataÚheadersÚapi_keyÚsupports_bearer_tokenc	                 óP  — |sd }	n|�|}	nt        d«      }	|	r	 ddlm}
 d|	› �|d<    |
d|||¬«      }n²	 dd	lm} ddlm}
 | j                  |«      } ||d
|«      } |
d|||¬«      }|j                  |«       |j                  «       D ].  \  }}|€Œ	|j                  «       t        vsŒ ||j                  |<   Œ0 |�*d|v r&|d   j                  d«      s|d   |j                  d<   |j                  «       }|S # t        $ r t        d«      ‚w xY w# t        $ r t        d«      ‚w xY w)NÚAWS_BEARER_TOKEN_BEDROCKr   ©Ú
AWSRequestr§  úBearer ÚAuthorizationr=   ©r>   r?   r¬  r­  ©Ú	SigV4AuthÚbedrockúAWS4-HMAC-SHA256)r   Úbotocore.awsrequestr³  r©  Úbotocore.authr¸  Ú!_filter_headers_for_aws_signatureÚadd_authr¨   rÊ   r'   r­  r©   Úprepare)rI   r*   r+   r«  r  r¬  r­  r®  r¯  Úaws_bearer_tokenr³  rA   r¸  Úaws_signature_headersÚsigv4Úheader_nameÚheader_valueÚpreppeds                     r4   Úget_request_headerszBaseAWSLLM.get_request_headers¢  sr  € ñ %Ø+/ÑØÐ Ø&Ñä-Ð.HÓIÐáð]Ý:ð *1Ð1AÐ0BÐ'CˆG�OÑ$Ù ¨°LÀtÐU\Ô]‰Gð]Ý3Ý:ð ,0×+QÑ+QÐRYÓ+ZÐ!Ù$ [°)¸_ÓMˆEÙ ØØ ØØ-ô	ˆGð �N‰N˜7Ô#ð .5¯]©]«_ò @Ñ)�˜\ØÑ+°×0AÑ0AÓ0CÔKaÒ0aØ3?�G—O‘O KÒ0ð@ð
 Ð)Ø# }Ñ4Ø% oÑ6×AÑAÐBTÔUà3@ÀÑ3Q�—‘ Ñ0Ø Ÿ™Ó*ˆàˆøôI ò ]Ü!Ð"[Ó\Ð\ð]ûô ò ]Ü!Ð"[Ó\Ð\ð]ús   ™C8 µD Ã8DÄD%c                 óÀ   — i }h d£}|j                  «       D ]D  \  }}|€Œ	|j                  «       }||v s#|j                  d«      s|j                  d«      sŒ@|||<   ŒF |S )z½
        Filter headers to only include those that AWS SigV4 includes in signature calculation.
        This Fixes forwarded client headers from breaking the signature calculation.
        >
   úx-amz-algorithmúx-amz-signatureúx-amz-credentialúx-amz-signedheadersúx-amz-content-sha256r#   rÿ   r%   úcontent-typer&   zx-amz-zx-amzn-)r¨   rÊ   r©   )rI   r­  rÁ  Úaws_headersrÃ  rÄ  Úheader_lowers          r4   r½  z,BaseAWSLLM._filter_headers_for_aws_signatureÞ  s}   € ð
 (*Ðò
ˆð *1¯©«ò 	BÑ%ˆK˜ØÐ#ØØ&×,Ñ,Ó.ˆLØ˜{Ñ*¨l×.EÑ.EÀhÔ.OÐS_×SjÑSjÐktÕSuØ5AÐ% kÒ2ð	Bð %Ð$r3   Úservice_name)r¹  Ú	sagemakerzbedrock-agentcoreÚ	s3vectorszaws-external-anthropicÚrequest_dataÚstreamÚfake_streamc
                 ó„  — |	�|	}
nt        d«      }
|
r8|xs i }d|d<   d|
› �|d<   |t        j                  |«      j                  «       fS 	 ddlm} dd	lm} dd
lm	} |j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }| j                  ||¬«      }| j                  ||||||||||¬«
      } ||||«      }|xs i }t        d„ |D «       «      sddi|¥}| j                  |«      } |d|t        j                  |«      |¬«      }|j!                  |«       t#        |j$                  «      }|j'                  «       D ]$  \  }}|€Œ	|j)                  «       t*        vsŒ |||<   Œ& t-        d„ |j'                  «       D «       d«      }|�|j/                  d«      s||d<   ||j0                  fS # t        $ r t        d«      ‚w xY w)z·
        Sign a request for Bedrock or Sagemaker

        Returns:
            Tuple[dict, Optional[str]]: A tuple containing the headers and the json str body of the request
        Nr±  zapplication/jsonzContent-Typer´  rµ  r   r·  r²  r   r§  r[   rZ   r\   r_   r]   r^   r`   ra   rb   )rÍ   r²   r¨  c              3   óB   K  — | ]  }|j                  «       d k(  –— Œ y­w)rÍ  N©rÊ   )rT   rÃ  s     r4   rV   z+BaseAWSLLM._sign_request.<locals>.<genexpr>B  s   è ø€ ÒT¸[�;×$Ñ$Ó&¨.Õ8ÑTùs   ‚r=   r¶  c              3   óT   K  — | ]   \  }}|j                  «       d k(  sŒ|€Œ|–— Œ" y­w)r$   NrØ  )rT   Únamer�   s      r4   rV   z+BaseAWSLLM._sign_request.<locals>.<genexpr>U  s'   è ø€ Òo‘{�t˜U¸¿¹»ÈÓ9XÐ]bÑ]nŒUÑoùs   ‚(ž(¡(rº  )r   rn   ro   rr   r¼  r¸  r»  r³  r  r    r©  rí   r÷   r±   Úanyr½  r¾  Údictr­  r¨   rÊ   r'   Únextr©   Úbody) rI   rÐ  r­  rÍ   rÓ  r™  r²   rÔ  rÕ  r®  rÀ  r¸  r³  r    r[   rZ   r\   r_   r]   r^   r`   ra   rb   r+   r*   rÂ  rÁ  rA   Úrequest_headers_dictrÃ  rÄ  Úincoming_authorizations                                    r4   Ú_sign_requestzBaseAWSLLM._sign_requestú  s©  € ð0 ÐØ+2Ñä-Ð.HÓIÐñ Ø’m ˆGØ&8ˆG�NÑ#Ø)0Ð1AÐ0BÐ'CˆG�OÑ$ØœDŸJ™J |Ó4×;Ñ;Ó=Ð=Ð=ð	YÝ/Ý6Ý8ð (7×':Ñ':Ð;RÐTXÓ'YÐØ#2×#6Ñ#6Ð7JÈDÓ#QÐØ#2×#6Ñ#6Ð7JÈDÓ#QÐØ.×2Ñ2°?ÀDÓIˆØ"1×"5Ñ"5Ð6HÈ$Ó"OÐØ"1×"5Ñ"5Ð6HÈ$Ó"OÐØ(7×(;Ñ(;Ð<TÐVZÓ([ÐØ"1×"5Ñ"5Ð6HÈ$Ó"OÐØ!0×!4Ñ!4Ð5FÈÓ!MˆØ!%×!:Ñ!:È?ÐbgÐ!:Ó!hˆà*.×*>Ñ*>Ø/Ø"7Ø/Ø+Ø-Ø-Ø'Ø#9Ø-Ø+ð +?ó +
ˆñ ! ¨l¸OÓLˆØ’-˜RˆÜÑTÈGÔTÔTØ%Ð'9ÐE¸WÐEˆGà'+×'MÑ'MÈgÓ'VÐÙ#ØØÜ—‘˜LÓ)Ø)ô	
ˆð 	�‰�wÔä&*¨7¯?©?Ó&;Ðð *1¯©«ò 	AÑ%ˆK˜ØÑ'¨K×,=Ñ,=Ó,?ÔG]Ò,]Ø4@Ð$ [Ò1ð	Aô )-Ùo g§m¡m£oÔoØó)
Ðð "Ð-Ð6L×6WÑ6WØô7
ð 5KÐ  Ñ1à# W§\¡\Ð1Ð1øôu ò 	YÜÐWÓXÐXð	Yús   ÁH* È*H?)rX   NrS   )NNNNNNNNNNN)NN)NNN)NNNN)r›  )NT)Jr-   r.   r/   r   r   r   rQ   r	   r0   r¥   Úranger   rW   r   rH   Úboolr1   rj   rÜ  ru   r   r   r€  r   Ústaticmethodr�   rƒ   r…   rˆ   r‹   r   Úwrapr±   r½   r   rÃ   rÌ   rÞ   rÝ   rÛ   r   rè   r÷   rî   r   r  r	  r  r  r-  r8  r    rž   rv  rx  r†  r¢   rˆ  rª   r«   r¤   r¬   r\  r   r£  r   r)   rª  Úbytesr   rÆ  r½  rá  rK   rL   s   @r4   rN   rN   G   s<  ø… ñ .7Ù%Ð9VÔWô.Ð�x 	Ñ*ó ñ ;@ñ @ÙÐBÓCô@ó ;Ð˜X e¨D°#¨IÑ&6Ñ7ó õ
ñ"5¨$°©*°tÑ*;ó 5ðC¨T°#°s¸T±z°/Ñ-Bð CÀsó Cðà˜c 3¨¡:˜oÑ.ðð % R¨¨s°C¸$±J¨Ñ)?Ð%?Ñ@ðð 
ó	ð@ ðqØ # d¡
ðqà˜T‘zðqð  ™*ðqð 
ò	qó ðqð ð)¨c°D©jð )¸Tò )ó ð)ð ð,°C¸$±Jð ,À4ò ,ó ð,ð ðuØ ™:ðuà" T™zðuð  ™:ðuð 
ò	uó ðuð ðsØ ™:ðsà" T™zðsð ˜t™ðsð 
ò	só ðsð €V‡[�[ƒ]ð )-Ø,0Ø(,Ø&*Ø'+Ø'+Ø$(Ø-1Ø'+Ø&*Ø(,ñRWà ™:ðRWð  # T™zðRWð  ™:ð	RWð
 ˜t™ðRWð  ™*ðRWð  ™*ðRWð ˜T‘zðRWð !$ d¡
ðRWð  ™*ðRWð ˜t™ðRWð ˜3‘J Ñ%òRWó ðRWðh°C¸$±Jð À3ÈÁ:ó ð0 ðØðà	)¨DÑ	0òó ðð& ð!Øð!à	)¨DÑ	0ò!ó ð!ðF ð0Øð0à2°TÑ9ð0ð ð0ð 
ò	0ó ð0ðd ð=Øð=àð=ð 
ò=ó ð=ð ð5 #ð 5¨#ò 5ó ð5ð ð&Øð&à	,¨tÑ	3ò&ó ð&ðV !Ø#ñ	:àð:ð �T‰zð:ð ˜‘*ð	:ð
 
ó:ðx ð°3¸±:ð À$ò ó ðð ð1Ø ™*ð1à	ˆt‰ò1ó ð1ð à'+Ø&*ñ

Ø ™*ð

à˜t™ð

ð 
ˆt‰ò

ó ð

ð (,Ø(,Ø&*ñ	à ™*ðð ˜3‘J Ñ%ðð ˜t™ð	ð
 
óð" '+ñà˜t™óð: ð#0Øð#0à	ˆs�C˜ˆ}Ñ	 Ñ	$ò#0ó ð#0ðP )-ñ9àð9ð ˜3‘J Ñ%ð9ð 
ó	9ðv ð9°cð 9¸cÀD¹jò 9ó ð9ð$ €V‡[�[ƒ]ð '+Ø(,ñQHà #ðQHð ðQHð ð	QHð
 ˜t™ðQHð  ™*ðQHð ˜t™ðQHð ˜3‘J Ñ%ðQHð 
ˆ{˜C $™JÐ&Ñ	'òQHó ðQHðr '+Ø'+Ø(,Ø&*ñGGàðGGð ðGGð ð	GGð
 "%ðGGð ˜t™ðGGð  ™*ðGGð ˜3‘J Ñ%ðGGð ˜t™ðGGð 
óGGðZ '+Ø'+Ø(,Ø&*ñ(<àð(<ð ð(<ð ˜t™ð	(<ð
  ™*ð(<ð ˜3‘J Ñ%ð(<ð ˜t™ð(<ð 
ó(<ðT ¸ð  À%ÈÐUXÐ[_ÑU_ÐH_ÑB`ó  ð.%
à ™:ð%
ð  # T™zð%
ð  ™:ð	%
ð
 ð%
ð  ™*ð%
ð ˜t™ð%
ð  ™*ð%
ð ˜t™ð%
ð ˜3‘J Ñ%ð%
ð 
ˆ{˜C $™JÐ&Ñ	'ó%
ðN €V‡[�[ƒ]ð '+Ø'+Ø&*Ø(,ñF$à ™:ðF$ð  # T™zðF$ð  ™:ð	F$ð
 ðF$ð ðF$ð ˜t™ðF$ð  ™*ðF$ð ˜t™ðF$ð ˜3‘J Ñ%ðF$ð 
ˆ{˜C $™JÐ&Ñ	'òF$ó ðF$ðP €V‡[�[ƒ]ð	2°sð 	2¸uÀ[ÐRUÐX\ÑR\ÐE\Ñ?]ò 	2ó ð	2ð €V‡[�[ƒ]ð!àð!ð  #ð!ð ð	!ð
 
ˆ{˜C $™JÐ&Ñ	'ò!ó ð!ð( €V‡[�[ƒ]ðJàðJð  #ðJð ˜t™ð	Jð
 
ˆ{˜C $™JÐ&Ñ	'òJó ðJð0 €V‡[�[ƒ]ð	% U¨;¸¸d¹
Ð+BÑ%Cò 	%ó ð	%ð €V‡[�[ƒ]ð¸ò ó ðð JSñ0à˜‘*ð0ð '*¨D¡jð0ð ð	0ð
 Ð>Ñ?À$ÑFð0ð 
ˆs�Cˆx‰ó0ð<MàÐ>Ñ?À$ÑFðMð ðMð 
ó	Mð& :>ñ2
Ø#ð2
Ø,/°$©Jð2
à	ó2
ðh €V‡[�[ƒ]ð #Ø&*ñ9à ð9ð ð9ð ˜d‘{ð	9ð
 ð9ð �E‰kð9ð ð9ð �t‘ð9ð  $ð9ð 
ò9ó ð9ðv%¸ð %À$ó %ðR !Ø"Ø#'Ø"ñ!c2àð&ñ
ðc2ð ðc2ð ðc2ð ðc2ð ðc2ð �T‰zðc2ð �t‘ðc2ð ˜D‘[ðc2ð  �t‘ð!c2ð" 
ˆt�U˜T‘\Ð!Ñ	"÷#c2r3   rN   )<r1  rp   rn   rŽ   ÚreÚurllib.parserâ   Úcollections.abcr   r   Ú	threadingr   Útypingr   r   r	   r
   r   r   r   rC   Úpydanticr   r   Úlitellm._loggingr   Úlitellm.caching.cachingr   Úlitellm.caching.in_memory_cacher   Úlitellm.constantsr   r   r   r   r   r   Ú(litellm.litellm_core_utils.aws_partitionr   r   Ú%litellm.litellm_core_utils.dd_tracingr   Úlitellm.secret_managers.mainr   r   r»  r   r  r    Úcompiler!   r0   r"   Ú	frozensetr'   r)   r6   rº   r;   rN   r2   r3   r4   ú<module>rö     sÛ   ðÜ Û Û Û 	Û 	Û Ý $Ý Ý ß O× OÑ Oã ß /å +Ý -Ý 9÷÷ ÷ ^Ý 8ß CáÝ6Þ0à€KØÐð
 $. 2§:¡:Ð.?Ó#@Ð ˜5Ó @ð ,6¨2¯:©:Ø\ó,Ð ! 5ó ñ !*Ò*iÓ jÐ ˜Ó jô-˜9ô -ô˜iô ô
'�9ô '÷V2ò V2r3   