o
    ưis                     @  s  U d dl mZ 	 d dlZd dlZd dlmZmZmZmZm	Z	m
Z
 er(d dlmZ d dl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 erRd d	lmZ G d
d deZdadd ZdOddZG dd dZdd ZdPddZ 											dQdRd(d)Z!G d*d+ d+Z"dSd.d/Z#da$d0e%d1< dTd3d4Z&dTd5d6Z'dUd8d9Z(dUd:d;Z)dUd<d=Z*dUd>d?Z+dVdAdBZ,d dCl-m.Z. G dDdE dEeZ/dWdFdGZ0G dHdI dIZ1dXdKdLZ2G dMdN dNZ3dS )Y    )annotationsN)TYPE_CHECKINGDictListLiteralOptionalUnion)BedrockCreateBatchRequest)BaseAnthropicMessagesConfig)BaseLLMModelInfoBaseTokenCounter)BaseLLMException)
get_secret)AllMessageValuesc                   @  s   e Zd ZdS )BedrockErrorN)__name__
__module____qualname__ r   r   X/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/bedrock/common_utils.pyr      s    r   c                  C  s   t du rddlm}  | a t S )a/  
    Lazy import and cache get_model_info to avoid circular imports.

    This function is used by bedrock transformation classes that need get_model_info
    but cannot import it at module level due to circular import issues.
    The function is cached after first use to avoid performance impact.
    Nr   get_model_info)_get_model_infolitellmr   r   r   r   r   get_cached_model_info$   s   	r   request_bodydictreturnNonec                 C  s@   |  d}|rt|tsdS |D ]}t|tr|dd qdS )a  
    Remove ``custom`` field from each tool in the request body.

    Claude Code (v2.1.69+) sends ``custom: {defer_loading: true}`` on tool
    definitions, which Anthropic's API accepts but Bedrock rejects with
    ``"Extra inputs are not permitted"``.

    Args:
        request_body: The request dictionary to modify in-place.

    Ref: https://github.com/BerriAI/litellm/issues/22847
    toolsNZcustom)get
isinstancelistr   pop)r   r   Ztoolr   r   r   remove_custom_field_from_tools4   s   

r$   c                   @  sd   e Zd Zdd ZdddZdd	d
ZdddZdddZdddZdddZ	dddZ
dddZdS )AmazonBedrockGlobalConfigc                 C  s   d S Nr   selfr   r   r   __init__J      z"AmazonBedrockGlobalConfig.__init__r   r   c                 C  s   ddiS )zS
        Mapping of common auth params across bedrock/vertex/azure/watsonx
        region_nameaws_region_namer   r'   r   r   r   get_mapped_special_auth_paramsM      z8AmazonBedrockGlobalConfig.get_mapped_special_auth_paramsnon_default_paramsoptional_paramsc                 C  s2   |   }| D ]\}}||v r|||| < q|S r&   )r-   items)r(   r/   r0   Zmapped_paramsparamvaluer   r   r   map_special_auth_paramsS   s   z1AmazonBedrockGlobalConfig.map_special_auth_params	List[str]c                 C  s(   |   |   |   |   |   S r&   )get_us_regionsget_eu_regionsget_ap_regionsget_ca_regionsget_sa_regionsr'   r   r   r   get_all_regionsZ   s   z)AmazonBedrockGlobalConfig.get_all_regionsc                 C     g dS )D
        Source: https://www.aws-services.info/bedrock.html
        )zap-northeast-1zap-northeast-2zap-northeast-3z
ap-south-1z
ap-south-2zap-southeast-1zap-southeast-2r   r'   r   r   r   r8   c   r.   z(AmazonBedrockGlobalConfig.get_ap_regionsc                 C     dgS )Nz	sa-east-1r   r'   r   r   r   r:   q      z(AmazonBedrockGlobalConfig.get_sa_regionsc                 C  r<   )r=   )z	eu-west-1z	eu-west-2z	eu-west-3zeu-central-1zeu-central-2z
eu-south-1z
eu-south-2z
eu-north-1r   r'   r   r   r   r7   t   r.   z(AmazonBedrockGlobalConfig.get_eu_regionsc                 C  r>   )Nzca-central-1r   r'   r   r   r   r9      r?   z(AmazonBedrockGlobalConfig.get_ca_regionsc                 C  r<   )r=   )z	us-east-1z	us-east-2z	us-west-1z	us-west-2zus-gov-east-1zus-gov-west-1r   r'   r   r   r   r6      r.   z(AmazonBedrockGlobalConfig.get_us_regionsN)r   r   )r/   r   r0   r   r   r5   )r   r   r   r)   r-   r4   r;   r8   r:   r7   r9   r6   r   r   r   r   r%   I   s    



	


r%   c                   s    fdd}|S )z,Closure to capture the headers and add them.c                   s$      D ]\}}| j|| qdS )z.Actual callback function that Boto3 will call.N)r1   headers
add_header)requestkwargsheader_nameheader_valuerA   r   r   callback   s   z#add_custom_header.<locals>.callbackr   )rA   rH   r   rG   r   add_custom_header   s   rI   Union[bool, str]c                  C  s   ddl m}  |  S )z
    Get SSL verification setting for Bedrock client.

    Returns the SSL verification setting which can be:
    - True: Use default SSL verification
    - False: Disable SSL verification
    - str: Path to a custom CA bundle file
    r   get_ssl_verify)Z&litellm.llms.custom_httpx.http_handlerrL   rK   r   r   r   _get_bedrock_client_ssl_verify   s   	rM   aws_access_key_idOptional[str]aws_secret_access_keyr,   aws_bedrock_runtime_endpointaws_session_nameaws_profile_nameaws_role_nameaws_web_identity_tokenextra_headersOptional[dict]timeout%Optional[Union[float, httpx.Timeout]]c              
   C  s  t dd }t dd }||||||||g}t|D ]\}}|r)|dr)t |||< q|\}}}}}}}}t }| r:n|r?|} n|rD|} n|rI|} ntdddt d}|rX|}n|r]|}nd|  d	}d
d l}t|
tru|jj	|
|
d}nt|
t
jr|jj	|
j|
jd}n|j	 }|d ur|d ur|d urt |}|d u rtddd|jd|d}|j|||dd}|jd|d d |d d |d d | |||d}nd|d ur|d ur|jd|||d}|j||d}|jd|d d |d d |d d | |||d}n0|d ur|jd||| |||d}n|d ur)|j|djd| |||d}n
|jd| |||d}|	r@|jjdt|	 |S )NZAWS_REGION_NAMEZ
AWS_REGIONzos.environ/zRAWS region not set: set AWS_REGION_NAME or AWS_REGION env variable or in .env filei  )messagestatus_codeZAWS_BEDROCK_RUNTIME_ENDPOINTzhttps://bedrock-runtime.z.amazonaws.comr   )connect_timeoutread_timeoutz6OIDC token could not be retrieved from secret manager.sts)verifyi  )RoleArnRoleSessionNameZWebIdentityTokenZDurationSecondsbedrock-runtimeCredentialsZAccessKeyIdZSecretAccessKeyZSessionToken)service_namerN   rP   aws_session_tokenr+   endpoint_urlconfigr_   )rN   rP   r_   )r`   ra   )rd   rN   rP   r+   rf   rg   r_   )Zprofile_name)rd   r+   rf   rg   r_   zbefore-sign.bedrock-runtime.*)r   	enumerate
startswithrM   r   boto3r!   floatsessionZConfighttpxTimeoutconnectreadclientZassume_role_with_web_identityZassume_roleSessionmetaeventsregisterrI   )r+   rN   rP   r,   rQ   rR   rS   rT   rU   rV   rX   Zlitellm_aws_region_nameZstandard_aws_region_nameZparams_to_checkir2   Z
ssl_verifyZ env_aws_bedrock_runtime_endpointrf   rj   rg   Z
oidc_tokenZ
sts_clientZsts_responserq   r   r   r   init_bedrock_client   s   













	rw   c                   @  s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )ModelResponseIteratorc                 C  s   || _ d| _d S )NF)model_responseis_done)r(   ry   r   r   r   r)   d  s   
zModelResponseIterator.__init__c                 C     | S r&   r   r'   r   r   r   __iter__i  r*   zModelResponseIterator.__iter__c                 C  s   | j rtd| _ | jS NT)rz   StopIterationry   r'   r   r   r   __next__l  s   zModelResponseIterator.__next__c                 C  r{   r&   r   r'   r   r   r   	__aiter__s  r*   zModelResponseIterator.__aiter__c                   s   | j rtd| _ | jS r}   )rz   StopAsyncIterationry   r'   r   r   r   	__anext__v  s
   zModelResponseIterator.__anext__N)r   r   r   r)   r|   r   r   r   r   r   r   r   rx   c  s    rx   response_tool_namestrc                 C  s   | t jjv rt jj|  } | S )z
    If litellm formatted the input tool name, we need to convert it back to the original name.

    Args:
        response_tool_name (str): The name of the tool as received from the response.

    Returns:
        str: The original name of the tool.
    )r   Zbedrock_tool_name_mappingsZ
cache_dict)r   r   r   r   get_bedrock_tool_name}  s
   r   zOptional[List[str]]_BEDROCK_GLOBAL_REGIONSr5   c                   C  s   t du r	t  a t S )z0Get all Bedrock regions, cached at module level.N)r   r%   r;   r   r   r   r   _get_all_bedrock_regions  s   
r   c                   C  r<   )zIAbbreviations of regions AWS Bedrock supports for cross region inference.)globaluseuZapacZjpauzus-govr   r   r   r   r   *get_bedrock_cross_region_inference_regions  s   r   modelc                 C  s   d|   v r| dd S | S )z
    Extract the model name from an AWS Bedrock ARN.
    Returns the string after the last '/' if 'arn' is in the input string.
    Zarn/)lowersplitr   r   r   r   #extract_model_name_from_bedrock_arn  s   r   c                 C  s(   dD ]}|  |r| ddd } q| S )z/Strip LiteLLM routing prefixes from model name.)bedrock/	converse/invoke/openai/nova-2/nova/r      )ri   r   )r   prefixr   r   r   strip_bedrock_routing_prefix  s
   
r   c                 C  s   ddl }|dd| S )z8Strip throughput tier suffixes from Bedrock model names.r   Nz(:\d+):\d+k$z\1)resub)r   r   r   r   r   strip_bedrock_throughput_suffix  s   r   c                 C  s   | }dD ]}| |r|t|d } nq| drdS | dr$dS t| } t| } t| } | ddd	 }| d
dd	 }|t v rM| ddd S |t v rdt| d
ddkrd| d
dd S | S )a  
    Get the base model from the given model name.

    Handle model names like:
    - "us.meta.llama3-2-11b-instruct-v1:0" -> "meta.llama3-2-11b-instruct-v1"
    - "bedrock/converse/model" -> "model"
    - "anthropic.claude-3-5-sonnet-20241022-v2:0:51k" -> "anthropic.claude-3-5-sonnet-20241022-v2:0"
    - "bedrock/nova-2/arn:aws:..." -> "amazon.nova-2-custom"
    - "bedrock/nova/arn:aws:..." -> "amazon.nova-custom"
    )zbedrock/converse/r   r   Nr   zamazon.nova-2-customr   zamazon.nova-custom.r   r   r   )ri   lenr   r   r   r   r   r   )r   strippedrpZpotential_regionZalt_potential_regionr   r   r   get_bedrock_base_model  s*   




r   boolc                   s&   |    g d}t fdd|D S )z
    Check if the model is a Claude 4.5 model on Bedrock.
    Claude 4.5 models support prompt caching with '5m' and '1h' TTL on Bedrock.
    )z
sonnet-4.5z
sonnet_4.5z
sonnet-4-5Z
sonnet_4_5z	haiku-4.5z	haiku_4.5z	haiku-4-5Z	haiku_4_5zopus-4.5zopus_4.5zopus-4-5Zopus_4_5z
sonnet-4.6z
sonnet_4.6z
sonnet-4-6Z
sonnet_4_6zopus-4.6zopus_4.6zopus-4-6Zopus_4_6c                 3  s    | ]}| v V  qd S r&   r   ).0patternZmodel_lowerr   r   	<genexpr>  s    z+is_claude_4_5_on_bedrock.<locals>.<genexpr>)r   any)r   Zclaude_4_5_patternsr   r   r   is_claude_4_5_on_bedrock  s   r   BedrockTokenCounterc                   @  s  e Zd Ze Ze Zed7d8ddZed7d9dd	Z			d:d;ddZ
	d:d<ddZd=ddZed>ddZed>ddZed>ddZed?d d!Zed@d#d$ZedAd&d'ZedAd(d)ZedAd*d+ZedAd,d-ZedAd.d/ZedAd0d1ZedAd2d3ZedBd5d6ZdS )CBedrockModelInfoNapi_baserO   r   c                 C  r{   )z7
        Get the API base for the given model.
        r   )r   r   r   r   get_api_base
     zBedrockModelInfo.get_api_baseapi_keyc                 C  r{   )z6
        Get the API key for the given model.
        r   )r   r   r   r   get_api_key  r   zBedrockModelInfo.get_api_keyrA   r   r   r   messagesList['AllMessageValues']r0   litellm_paramsc                 C  s   |S r&   r   )r(   rA   r   r   r0   r   r   r   r   r   r   validate_environment  s   
z%BedrockModelInfo.validate_environmentr5   c                 C  s   g S r&   r   )r(   r   r   r   r   r   
get_models$  s   zBedrockModelInfo.get_modelsOptional[BaseTokenCounter]c                 C     t  S )z
        Factory method to create a Bedrock token counter.

        Returns:
            BedrockTokenCounter instance for this provider.
        r   r'   r   r   r   get_token_counter9  s   z"BedrockModelInfo.get_token_counterc                 C     t | S )zKWrapper for standalone function. See extract_model_name_from_bedrock_arn().)r   r   r   r   r   extract_model_name_from_arnB     z,BedrockModelInfo.extract_model_name_from_arnc                 C  r   )zDWrapper for standalone function. See strip_bedrock_routing_prefix().)r   r   r   r   r   "get_non_litellm_routing_model_nameG  r   z3BedrockModelInfo.get_non_litellm_routing_model_namec                 C  r   )z>Wrapper for standalone function. See get_bedrock_base_model().)r   r   r   r   r   get_base_modelL  r   zBedrockModelInfo.get_base_modelc                   C  r   )zRWrapper for standalone function. See get_bedrock_cross_region_inference_regions().)r   r   r   r   r   (_supported_cross_region_inference_regionQ  s   z9BedrockModelInfo._supported_cross_region_inference_region^Literal['converse', 'invoke', 'converse_like', 'agent', 'agentcore', 'async_invoke', 'openai']c                 C  s   dddddddd}|  D ]\}}|| v r|  S q| d	d
d}|ds,|dr.dS t| }tj| d}|tjv sC|tjv rEdS dS )z<
        Get the bedrock route for the given model.
        Zinvokeconverse_likeconverseagent	agentcoreZasync_invokeopenai)r   converse_like/r   agent/
agentcore/async_invoke/r   r    r   r   r   r   )r1   replaceri   r   r   r   r   Zbedrock_converse_models)r   Zroute_mappingsr   Z
route_typeZ_model_after_bedrock
base_modelZ	alt_modelr   r   r   get_bedrock_routeV  s,   


z"BedrockModelInfo.get_bedrock_router   c                 C     d| v S )zC
        Check if the model is an explicit converse route.
        r   r   r   r   r   r   _explicit_converse_route     z)BedrockModelInfo._explicit_converse_routec                 C  r   )zA
        Check if the model is an explicit invoke route.
        r   r   r   r   r   r   _explicit_invoke_route  r   z'BedrockModelInfo._explicit_invoke_routec                 C  r   )z@
        Check if the model is an explicit agent route.
        r   r   r   r   r   r   _explicit_agent_route  r   z&BedrockModelInfo._explicit_agent_routec                 C  r   )zD
        Check if the model is an explicit agentcore route.
        r   r   r   r   r   r   _explicit_agentcore_route  r   z*BedrockModelInfo._explicit_agentcore_routec                 C  r   )zH
        Check if the model is an explicit converse like route.
        r   r   r   r   r   r   _explicit_converse_like_route  r   z.BedrockModelInfo._explicit_converse_like_routec                 C  r   )zG
        Check if the model is an explicit async invoke route.
        r   r   r   r   r   r   _explicit_async_invoke_route  r   z-BedrockModelInfo._explicit_async_invoke_routec                 C  r   )z
        Check if the model is an explicit openai route.
        Used for Bedrock imported models that use OpenAI Chat Completions format.
        r   r   r   r   r   r   _explicit_openai_route  s   z'BedrockModelInfo._explicit_openai_route%Optional[BaseAnthropicMessagesConfig]c                 C  s"   t | rdS d| v rt S dS )z
        Get the bedrock provider config for the given model.

        Only route to AmazonAnthropicClaude3MessagesConfig() for BaseMessagesConfig

        All other routes should return None since they will go through litellm.completion
        NZclaude)r   r   r   Z#AmazonAnthropicClaudeMessagesConfigr   r   r   r   ,get_bedrock_provider_config_for_messages_api  s
   
z=BedrockModelInfo.get_bedrock_provider_config_for_messages_apir&   )r   rO   r   rO   )r   rO   r   rO   )NN)rA   r   r   r   r   r   r0   r   r   r   r   rO   r   rO   r   r   )r   rO   r   rO   r   r5   )r   r   r   r   r   r   r@   )r   r   r   r   r   r   r   r   )r   r   r   r   )r   r   r   r%   Zglobal_configr;   Zall_global_regionsstaticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     sN    
	6r   c                 C  sd  t | }tjj| d}t | }|dks|dkrt S |dkr%t S |dkr2ddlm	} | S |dkr?dd	l
m} | S |d
krGt S |dkrZ|tj v rVt S t S |dksb|dkrft S |dkrnt S |dkrvt S |dkr~t S |dkrt S |dkrt S |dkrt S |dkrt S |dkrt S |dkrt S t S )z
    Helper function to get the appropriate Bedrock chat config based on model and route.

    Args:
        model: The model name/identifier

    Returns:
        The appropriate Bedrock config class instance
    r   r   r   r   r   r   )AmazonInvokeAgentConfigr   )AmazonAgentCoreConfigZamazonZ	anthropicrs   llamaZai21ZcohereZmistralZmoonshotZdeepseek_r1ZnovaZqwen3Zqwen2Z
twelvelabs)r   r   r   Z
BedrockLLMZget_bedrock_invoke_providerr   ZAmazonConverseConfigZAmazonBedrockOpenAIConfigZ5litellm.llms.bedrock.chat.invoke_agent.transformationr   Z2litellm.llms.bedrock.chat.agentcore.transformationr   ZAmazonTitanConfigZAmazonAnthropicConfigZ get_legacy_anthropic_model_namesZAmazonAnthropicClaudeConfigZAmazonLlamaConfigZAmazonAI21ConfigZAmazonCohereConfigZAmazonMistralConfigZAmazonMoonshotConfigZAmazonDeepSeekR1ConfigZAmazonInvokeNovaConfigZAmazonQwen3ConfigZAmazonQwen2ConfigZAmazonTwelveLabsPegasusConfigZAmazonInvokeConfig)r   Zbedrock_routeZbedrock_invoke_providerr   r   r   r   r   r   get_bedrock_chat_config  sX   


r   c                   @  s.   e Zd ZdZdZdd Zdd Zdd	d
ZdS )BedrockEventStreamDecoderBasez:
    Base class for event stream decoding for Bedrock
    Nc                 C     ddl m} | | _d S )Nr   )EventStreamJSONParser)Zbotocore.parsersr   parser)r(   r   r   r   r   r)   )  s   z&BedrockEventStreamDecoderBase.__init__c                 C  sN   | j d u r$ddlm} ddlm} | }|dd}||}|d| _ | j S )Nr   )Loader)ServiceModelrb   z	service-2ZResponseStream)_response_stream_shape_cacheZbotocore.loadersr   Zbotocore.modelr   Zload_service_modelZ	shape_for)r(   r   r   loaderZbedrock_service_dictZbedrock_service_modelr   r   r   get_response_stream_shape.  s   
z7BedrockEventStreamDecoderBase.get_response_stream_shaper   rO   c                 C  s   |  }| j||  }|d dkrO|d  }t|tr$|d}n
t|tr,|}nd}|d d}|d | }t	|d t|trKt
|d	|d	d
|v rc|d
}|s\d S |d S |d}|sld S | S )Nr[      bodyrZ   r   rA   z:exception-type )r[   rZ   chunkbytes)Zto_response_dictr   parser   decoder!   r   r    r   r   jsondumps)r(   eventZresponse_dictZparsed_responseZdecoded_bodyerror_messageZexception_statusr   r   r   r   _parse_message_from_event>  s:   




z7BedrockEventStreamDecoderBase._parse_message_from_event)r   rO   )r   r   r   __doc__r   r)   r   r   r   r   r   r   r   "  s    r   rA   c                 C  s   |  d}|s	g S t|tr|S t|trL| }|drB|drBzt|}t|tr6dd |D W S W n
 tj	yA   Y nw dd |
dD S g S )a  
    Extract anthropic-beta header values and convert them to a list.
    Supports both JSON array format and comma-separated values from user headers.

    Used by both converse and invoke transformations for consistent handling
    of anthropic-beta headers that should be passed to AWS Bedrock.

    Args:
        headers (dict): Request headers dictionary

    Returns:
        List[str]: List of anthropic beta feature strings, empty list if no header
    zanthropic-beta[]c                 S  s   g | ]}t | qS r   )r   stripr   betar   r   r   
<listcomp>  s    z3get_anthropic_beta_from_headers.<locals>.<listcomp>c                 S  s   g | ]}|  qS r   )r   r   r   r   r   r     s    ,)r    r!   r"   r   r   ri   endswithr   loadsJSONDecodeErrorr   )rA   Zanthropic_beta_headerparsedr   r   r   get_anthropic_beta_from_headersc  s(   




r  c                   @  sj   e Zd ZdZdd Zd,ddZd-ddZd.ddZ	d/d0ddZd1d2ddZ			d3d4d!d"Z
d5d)d*Zd+S )6CommonBatchFilesUtilsz
    Common utilities for Bedrock batch and file operations.
    Provides shared functionality to reduce code duplication between batches and files.
    c                 C  r   )Nr   )
BaseAWSLLM)Zbase_aws_llmr  	_base_aws)r(   r  r   r   r   r)     s   zCommonBatchFilesUtils.__init__r   r   r   c                 C  s   | dr|dd S |S )a  
        Extract the actual Bedrock model ID from LiteLLM model name.

        Args:
            model: LiteLLM model name (e.g., "bedrock/anthropic.claude-3-sonnet-20240229-v1:0")

        Returns:
            Bedrock model ID (e.g., "anthropic.claude-3-sonnet-20240229-v1:0")
        r      N)ri   )r(   r   r   r   r   'get_bedrock_model_id_from_litellm_model  s   

z=CommonBatchFilesUtils.get_bedrock_model_id_from_litellm_models3_urituplec                 C  sV   | dstd| |dd dd}t|dkr#td| |d |d fS )	z
        Parse S3 URI into bucket and key components.

        Args:
            s3_uri: S3 URI (e.g., "s3://bucket/key/path")

        Returns:
            Tuple of (bucket, key)

        Raises:
            ValueError: If URI format is invalid
        zs3://zInvalid S3 URI format:    Nr   r      r   )ri   
ValueErrorr   r   )r(   r	  Zs3_partsr   r   r   parse_s3_uri  s   
z"CommonBatchFilesUtils.parse_s3_urir0   r   c                 C  s   d|v r|d r|  |d S z:| |\}}|drD|dd }|d}t|dkrGd|dd }|drA|dd	 }|W S W d
S W d
S  tyS   Y d
S w )z
        Extract model ID from S3 file path.

        The Bedrock file transformation creates S3 objects with the model name embedded:
        Format: s3://bucket/litellm-bedrock-files-{model}-{uuid}.jsonl
        r   zlitellm-bedrock-files-   N-r   r   z.jsonliz)anthropic.claude-3-5-sonnet-20240620-v1:0)r  r  ri   r   r   joinr   	Exception)r(   r	  r0   Zbucket
object_keyZ
model_partpartsZ
model_namer   r   r   extract_model_from_s3_file_path  s,   




z5CommonBatchFilesUtils.extract_model_from_s3_file_pathPOSTrd   data-Union[str, dict, 'BedrockCreateBatchRequest']rf   methodc                 C  s(  zddl m} ddlm} W n ty   tdw | jj|dd}| jj|d|d|d	||d
|d|d|d|dd	}	|	 }
|
dkrVd}i }nt
|treddl}||}n|}ddi}||	||}||
|||d}|| | }t|jt
|tr|dfS |fS )a  
        Sign AWS request using Signature Version 4.

        Args:
            service_name: AWS service name ("bedrock" or "s3")
            data: Request data (string or dict)
            endpoint_url: Full endpoint URL
            optional_params: Optional parameters containing AWS credentials
            method: HTTP method (default: POST)

        Returns:
            Tuple of (signed_headers, signed_data)
        r   )	SigV4Auth)
AWSRequestz7Missing boto3 to call bedrock. Run 'pip install boto3'.r   )r0   r   rN   rP   re   rR   rS   rT   rU   aws_sts_endpoint)	rN   rP   re   r,   rR   rS   rT   rU   r  GETNzContent-Typezapplication/json)r  urlr  rA   zutf-8)Zbotocore.authr  Zbotocore.awsrequestr  ImportErrorr  Z_get_aws_region_nameZget_credentialsr    upperr!   r   r   r   Zadd_authpreparerA   r   encode)r(   rd   r  rf   r0   r  r  r  r,   credentialsZmethod_upperZrequest_datarA   r   Zsigv4rC   Zpreppedr   r   r   sign_aws_request  sR   


z&CommonBatchFilesUtils.sign_aws_requestr   r   c                 C  s2   ddl m} t| dd }| d| }|S )u]  
        Generate a unique job name for AWS services.
        AWS services often have length limits, so this creates a concise name.

        Args:
            model: Model name to include in the job name
            prefix: Prefix for the job name

        Returns:
            Unique job name (≤ 63 characters for Bedrock compatibility)
        r   uuidNr  z-batch-)litellm._uuidr&  r   uuid4)r(   r   r   r&  	unique_idZjob_namer   r   r   generate_unique_job_name,  s   z.CommonBatchFilesUtils.generate_unique_job_nameAWS_S3_BUCKET_NAMEr   bucket_env_var
key_prefixc                 C  s   ddl }ddlm} |dp|dpt|}|s#td| dt|  }t|	 dd }	| d| d|	 }
||
fS )	al  
        Get S3 bucket and generate a unique key from configuration.

        Args:
            litellm_params: LiteLLM parameters
            optional_params: Optional parameters
            bucket_env_var: Environment variable name for bucket
            key_prefix: Prefix for the S3 key

        Returns:
            Tuple of (bucket_name, object_key)
        r   Nr%  Zs3_bucket_namez>S3 bucket name is required. Set 's3_bucket_name' parameter or z env varr  r  )
timer'  r&  r    osgetenvr  intr   r(  )r(   r   r0   r,  r-  r.  r&  Zbucket_name	timestampr)  r  r   r   r   !get_s3_bucket_and_key_from_configA  s   

z7CommonBatchFilesUtils.get_s3_bucket_and_key_from_configr   r[   r1  rA   Union[Dict, httpx.Headers]r   c                 C  s   t |||dS )z3
        Get Bedrock-specific error class.
        )r[   rZ   rA   )r   )r(   r   r[   rA   r   r   r   get_error_classj  s   z%CommonBatchFilesUtils.get_error_classNr   )r	  r   r   r
  )r	  r   r0   r   r   r   )r  )rd   r   r  r  rf   r   r0   r   r  r   r   r
  )r   )r   r   r   r   r   r   )r+  r   )
r   r   r0   r   r,  r   r-  r   r   r
  )r   r   r[   r1  rA   r4  r   r   )r   r   r   r   r)   r  r  r  r$  r*  r3  r5  r   r   r   r   r    s    


,J)r  )r   r   r   r   )r   rJ   )NNNNNNNNNNN)rN   rO   rP   rO   r,   rO   rQ   rO   rR   rO   rS   rO   rT   rO   rU   rO   rV   rW   rX   rY   )r   r   r   r   r@   r   r   )r   r   )rA   r   r   r5   )4
__future__r   r   r/  typingr   r   r   r   r   r   Zlitellm.types.llms.bedrockr	   rm   r   Z7litellm.llms.base_llm.anthropic_messages.transformationr
   Z litellm.llms.base_llm.base_utilsr   r   Z)litellm.llms.base_llm.chat.transformationr   Zlitellm.secret_managers.mainr   Zlitellm.types.llms.openair   r   r   r   r$   r%   rI   rM   rw   rx   r   r   __annotations__r   r   r   r   r   r   r   Z7litellm.llms.bedrock.count_tokens.bedrock_token_counterr   r   r   r   r  r  r   r   r   r   <module>   sh     
K
 7







	
(  
XE
A)