
    i                       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rd d	lmZ  G d
 de      Zdad Zd(dZ G d d      Zd Zd)dZ 	 	 	 	 	 	 	 	 	 	 	 d*	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d+dZ! G d d      Z"d,dZ#da$de%d<   d-dZ&d-dZ'd.dZ(d.dZ)d.dZ*d.dZ+d/dZ,d dl-m.Z.  G d  d!e      Z/d0d"Z0 G d# d$      Z1d1d%Z2 G d& d'      Z3y)2    )annotationsN)TYPE_CHECKINGDictListLiteralOptionalUnion)BedrockCreateBatchRequest)BaseAnthropicMessagesConfig)BaseLLMModelInfoBaseTokenCounter)BaseLLMException)
get_secret)AllMessageValuesc                      e Zd Zy)BedrockErrorN)__name__
__module____qualname__     r/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/llms/bedrock/common_utils.pyr   r      s    r   r   c                 *    t         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.
    r   get_model_info)_get_model_infolitellmr   r   s    r   get_cached_model_infor   $   s     *(r   c                    | j                  d      }|rt        |t              sy|D ]%  }t        |t              s|j	                  dd       ' y)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
    toolsNcustom)get
isinstancelistdictpop)request_bodyr    tools      r   remove_custom_field_from_toolsr)   4   sE     W%E
5$/dD!HHXt$ r   c                  R    e Zd Zd ZddZddZddZddZddZddZ	ddZ
dd	Zy
)AmazonBedrockGlobalConfigc                     y Nr   selfs    r   __init__z"AmazonBedrockGlobalConfig.__init__J   s    r   c                
    ddiS )zS
        Mapping of common auth params across bedrock/vertex/azure/watsonx
        region_nameaws_region_namer   r.   s    r   get_mapped_special_auth_paramsz8AmazonBedrockGlobalConfig.get_mapped_special_auth_paramsM   s     011r   c                p    | j                         }|j                         D ]  \  }}||v s||||   <    |S r-   )r4   items)r/   non_default_paramsoptional_paramsmapped_paramsparamvalues         r   map_special_auth_paramsz1AmazonBedrockGlobalConfig.map_special_auth_paramsS   sF    ;;=.446LE5%8=e 45 7 r   c                    | j                         | j                         z   | j                         z   | j                         z   | j	                         z   S r-   )get_us_regionsget_eu_regionsget_ap_regionsget_ca_regionsget_sa_regionsr.   s    r   get_all_regionsz)AmazonBedrockGlobalConfig.get_all_regionsZ   s[    !!!#$!!#$ !!#$ !!#	$	
r   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.   s    r   r@   z(AmazonBedrockGlobalConfig.get_ap_regionsc   s    
 	
r   c                    dgS )Nz	sa-east-1r   r.   s    r   rB   z(AmazonBedrockGlobalConfig.get_sa_regionsq   s
    }r   c                
    g dS )rE   )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.   s    r   r?   z(AmazonBedrockGlobalConfig.get_eu_regionst   s    	
 		
r   c                    dgS )Nzca-central-1r   r.   s    r   rA   z(AmazonBedrockGlobalConfig.get_ca_regions   s    r   c                
    g dS )rE   )z	us-east-1z	us-east-2z	us-west-1z	us-west-2zus-gov-east-1zus-gov-west-1r   r.   s    r   r>   z(AmazonBedrockGlobalConfig.get_us_regions   s    
 	
r   N)returnr%   )r7   r%   r8   r%   rJ   	List[str])r   r   r   r0   r4   r<   rC   r@   rB   r?   rA   r>   r   r   r   r+   r+   I   s/    2


 
r   r+   c                      fd}|S )z,Closure to capture the headers and add them.c                n    j                         D ]!  \  }}| j                  j                  ||       # y)z.Actual callback function that Boto3 will call.N)r6   headers
add_header)requestkwargsheader_nameheader_valuerO   s       r   callbackz#add_custom_header.<locals>.callback   s,    )0%KOO&&{LA *9r   r   )rO   rU   s   ` r   add_custom_headerrV      s    B
 Or   c                     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)&litellm.llms.custom_httpx.http_handlerrY   rX   s    r   _get_bedrock_client_ssl_verifyr[      s     Fr   c           
     2   t        dd       }t        dd       }||||||||g}t        |      D ](  \  }}|s	|j                  d      st        |      ||<   * |\  }}}}}}}}t               }| rn|r|} n|r|} n|r|} nt	        dd      t        d      }|r|}n|r|}nd|  d	}d
d l}t        |
t              r|j                  j                  |
|
      }nft        |
t        j                        r2|j                  j                  |
j                  |
j                        }n|j                  j                         }|r|p|nt        |      }|t	        dd      |j                  d|      }|j                  |||d      }|j                  d|d   d   |d   d   |d   d   | |||      }n|V|T|j                  d|||      }|j!                  ||      }|j                  d|d   d   |d   d   |d   d   | |||      }nZ||j                  d||| |||      }n?|'|j#                  |      j                  d| |||      }n|j                  d| |||      }|	r/|j$                  j&                  j)                  dt+        |	             |S )NAWS_REGION_NAME
AWS_REGIONzos.environ/zRAWS region not set: set AWS_REGION_NAME or AWS_REGION env variable or in .env filei  )messagestatus_code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RoleSessionNameWebIdentityTokenDurationSecondsbedrock-runtimeCredentialsAccessKeyIdSecretAccessKeySessionToken)service_nameaws_access_key_idaws_secret_access_keyaws_session_tokenr2   endpoint_urlconfigre   )rp   rq   re   )rf   rg   )ro   rp   rq   r2   rs   rt   re   )profile_name)ro   r2   rs   rt   re   zbefore-sign.bedrock-runtime.*)r   	enumerate
startswithr[   r   boto3r#   floatsessionConfighttpxTimeoutconnectreadclientassume_role_with_web_identityassume_roleSessionmetaeventsregisterrV   )r2   rp   rq   r3   aws_bedrock_runtime_endpointaws_session_nameaws_profile_nameaws_role_nameaws_web_identity_tokenextra_headerstimeoutlitellm_aws_region_namestandard_aws_region_nameparams_to_checkir:   
ssl_verify env_aws_bedrock_runtime_endpointrs   rx   rt   
oidc_token
sts_clientsts_responser   s                            r   init_bedrock_clientr      s    )):DA),= 	$	O o.5U%%m4!+E!2OA / 		$ 01J 	%	 -	!.h
 	
 (22P'Q$#3	)71+nM'5!%%gG%T	GU]]	+%%#OO',, & 
 %%' 	*%( 67
P 
 \\%
\;
 "??!,' 	 @ 
 **=9-H".}"=>O"P*=9.I#%  	
 
	"'7'C\\/"7	 " 

 "--!3C . 
 **=9-H".}"=>O"P*=9.I#%  	
 
	& */"7#%  
 
	% ,<=DD*#% E 
 *#%  
 ##+->}-M	
 Mr   c                  *    e Zd Zd Zd Zd Zd Zd Zy)ModelResponseIteratorc                     || _         d| _        y )NF)model_responseis_done)r/   r   s     r   r0   zModelResponseIterator.__init__d  s    ,r   c                    | S r-   r   r.   s    r   __iter__zModelResponseIterator.__iter__i      r   c                L    | j                   rt        d| _         | j                  S NT)r   StopIterationr   r.   s    r   __next__zModelResponseIterator.__next__l  s"    <<"""r   c                    | S r-   r   r.   s    r   	__aiter__zModelResponseIterator.__aiter__s  r   r   c                T   K   | j                   rt        d| _         | j                  S wr   )r   StopAsyncIterationr   r.   s    r   	__anext__zModelResponseIterator.__anext__v  s&     <<$$"""s   &(N)r   r   r   r0   r   r   r   r   r   r   r   r   r   c  s    
##r   r   c                x    | 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   bedrock_tool_name_mappings
cache_dict)response_tool_names    r   get_bedrock_tool_namer   }  s:     W??JJJ$??JJ
 r   zOptional[List[str]]_BEDROCK_GLOBAL_REGIONSc                 J    t         t               j                         a t         S )z0Get all Bedrock regions, cached at module level.)r   r+   rC   r   r   r   _get_all_bedrock_regionsr     s"     &";"="M"M"O""r   c                 
    g dS )zIAbbreviations of regions AWS Bedrock supports for cross region inference.)globaluseuapacjpauzus-govr   r   r   r   *get_bedrock_cross_region_inference_regionsr     s    ??r   c                R    d| j                         v r| j                  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.
    arn/)lowersplitmodels    r   #extract_model_name_from_bedrock_arnr     s+    
 {{3##Lr   c                b    dD ])  }| j                  |      s| j                  dd      d   } + | S )z/Strip LiteLLM routing prefixes from model name.)bedrock/	converse/invoke/openai/nova-2/nova/r      )rw   r   )r   prefixs     r   strip_bedrock_routing_prefixr     s7    UF#KKQ'*E V Lr   c                0    ddl }|j                  dd|       S )z8Strip throughput tier suffixes from Bedrock model names.r   Nz(:\d+):\d+k$z\1)resub)r   r   s     r   strip_bedrock_throughput_suffixr     s     66/5%00r   c                   | }dD ]#  }|j                  |      s|t        |      d } n |j                  d      ry|j                  d      ryt        |       } t        |       } t	        |       } | j                  dd      d	   }| j                  d
d      d	   }|t               v r| j                  dd      d   S |t               v r3t        | j                  d
d            dkD  r| j                  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   )rw   lenr   r   r   r   r   r   )r   strippedrppotential_regionalt_potential_regions        r   get_bedrock_base_modelr     s    H<r"B	*H = 9%%			W	%#(/E/6E+E2E{{3*1- ;;sA.q1EGG{{3"1%% 8 ::C#$q({{3"1%%Lr   c                T    | j                         g d}t        f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-5
sonnet_4_5z	haiku-4.5z	haiku_4.5z	haiku-4-5	haiku_4_5zopus-4.5zopus_4.5zopus-4-5opus_4_5z
sonnet-4.6z
sonnet_4.6z
sonnet-4-6
sonnet_4_6zopus-4.6zopus_4.6zopus-4-6opus_4_6c              3  &   K   | ]  }|v  
 y wr-   r   ).0patternmodel_lowers     r   	<genexpr>z+is_claude_4_5_on_bedrock.<locals>.<genexpr>  s     I5H'w+%5Hs   )r   any)r   claude_4_5_patternsr   s     @r   is_claude_4_5_on_bedrockr     s,    
 ++-K, I5HIIIr   BedrockTokenCounterc                     e Zd Z e       Zej                         Zeddd       Zeddd       Z		 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ
	 d	 	 	 	 	 ddZddZedd       Zedd       Zedd	       Zedd
       Ze	 	 	 	 dd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Ze	 	 	 	 dd       Zy) BedrockModelInfoNc                    | S )z7
        Get the API base for the given model.
        r   )api_bases    r   get_api_basezBedrockModelInfo.get_api_base
  s	    
 r   c                    | S )z6
        Get the API key for the given model.
        r   )api_keys    r   get_api_keyzBedrockModelInfo.get_api_key  s	    
 r   c                    |S r-   r   )r/   rO   r   messagesr8   litellm_paramsr   r   s           r   validate_environmentz%BedrockModelInfo.validate_environment  s	     r   c                    g S r-   r   )r/   r   r   s      r   
get_modelszBedrockModelInfo.get_models$  s	     	r   c                    t               S )z
        Factory method to create a Bedrock token counter.

        Returns:
            BedrockTokenCounter instance for this provider.
        r   r.   s    r   get_token_counterz"BedrockModelInfo.get_token_counter9  s     #$$r   c                    t        |       S )zKWrapper for standalone function. See extract_model_name_from_bedrock_arn().)r   r   s    r   extract_model_name_from_arnz,BedrockModelInfo.extract_model_name_from_arnB  s     3599r   c                    t        |       S )zDWrapper for standalone function. See strip_bedrock_routing_prefix().)r   r   s    r   "get_non_litellm_routing_model_namez3BedrockModelInfo.get_non_litellm_routing_model_nameG  s     ,E22r   c                    t        |       S )z>Wrapper for standalone function. See get_bedrock_base_model().)r   r   s    r   get_base_modelzBedrockModelInfo.get_base_modelL  s     &e,,r   c                     t               S )zRWrapper for standalone function. See get_bedrock_cross_region_inference_regions().)r   r   r   r   (_supported_cross_region_inference_regionz9BedrockModelInfo._supported_cross_region_inference_regionQ  s     :;;r   c                d   dddddddd}|j                         D ]  \  }}|| v s|c S  | j                  d	d
d      }|j                  d      s|j                  d      ryt        j	                  |       }t        j                  |       }|t        j                  v s|t        j                  v ryy)z<
        Get the bedrock route for the given model.
        invokeconverse_likeconverseagent	agentcoreasync_invokeopenai)r   converse_like/r   agent/
agentcore/async_invoke/r   r    r   r   r   r   )r6   replacerw   r   r   r   r   bedrock_converse_models)r   route_mappingsr   
route_type_model_after_bedrock
base_model	alt_models          r   get_bedrock_routez"BedrockModelInfo.get_bedrock_routeV  s    6  -#%+
 	, #1"6"6"8FJ!! #9
  %}}ZQ?**
!,,W5%44U;
$GGeGT	'999G;;;r   c                
    d| v S )zC
        Check if the model is an explicit converse route.
        r   r   r   s    r   _explicit_converse_routez)BedrockModelInfo._explicit_converse_route  s    
 e##r   c                
    d| v S )zA
        Check if the model is an explicit invoke route.
        r   r   r   s    r   _explicit_invoke_routez'BedrockModelInfo._explicit_invoke_route  s    
 E!!r   c                
    d| v S )z@
        Check if the model is an explicit agent route.
        r	  r   r   s    r   _explicit_agent_routez&BedrockModelInfo._explicit_agent_route  s    
 5  r   c                
    d| v S )zD
        Check if the model is an explicit agentcore route.
        r
  r   r   s    r   _explicit_agentcore_routez*BedrockModelInfo._explicit_agentcore_route  s    
 u$$r   c                
    d| v S )zH
        Check if the model is an explicit converse like route.
        r  r   r   s    r   _explicit_converse_like_routez.BedrockModelInfo._explicit_converse_like_route  s    
  5((r   c                
    d| v S )zG
        Check if the model is an explicit async invoke route.
        r  r   r   s    r   _explicit_async_invoke_routez-BedrockModelInfo._explicit_async_invoke_route  s    
 %''r   c                
    d| v S )z
        Check if the model is an explicit openai route.
        Used for Bedrock imported models that use OpenAI Chat Completions format.
        r   r   r   s    r   _explicit_openai_routez'BedrockModelInfo._explicit_openai_route  s     E!!r   c                `    t         j                  |       ryd| v rt        j                         S y)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
        Nclaude)r   r  r   #AmazonAnthropicClaudeMessagesConfigr   s    r   ,get_bedrock_provider_config_for_messages_apiz=BedrockModelInfo.get_bedrock_provider_config_for_messages_api  s3     44U; u>>@@
 r   r-   )r   Optional[str]rJ   r'  )r   r'  rJ   r'  )NN)rO   r%   r   strr   zList['AllMessageValues']r8   r%   r   r%   r   r'  r   r'  rJ   r%   )r   r'  r   r'  rJ   rL   )rJ   zOptional[BaseTokenCounter]r   r(  rJ   r(  rK   )r   r(  rJ   z^Literal['converse', 'invoke', 'converse_like', 'agent', 'agentcore', 'async_invoke', 'openai']r   r(  rJ   bool)r   r(  rJ   z%Optional[BaseAnthropicMessagesConfig])r   r   r   r+   global_configrC   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     s   -/M&668    "&"&

 
 +	

 
 
 
  
 

 HL$7D	*% : : 3 3 - - < < 66
6 6p $ $ " " ! ! % % ) ) ( ( " " 	. r   r   c                >   t         j                  |       }t        j                  j	                  |       }t         j                  |       }|dk(  s|dk(  rt        j                         S |dk(  rt        j                         S |dk(  rddlm	}  |       S |dk(  rdd	l
m}  |       S |d
k(  rt        j                         S |dk(  rH|t        j                  j                         v rt        j                         S t        j                         S |dk(  s|dk(  rt        j                          S |dk(  rt        j"                         S |dk(  rt        j$                         S |dk(  rt        j&                         S |dk(  rt        j(                         S |dk(  rt        j*                         S |dk(  rt        j,                         S |dk(  rt        j.                         S |dk(  rt        j0                         S |dk(  rt        j2                         S t        j4                         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  )AmazonAgentCoreConfigamazon	anthropicr   llamaai21coheremistralmoonshotdeepseek_r1novaqwen3qwen2
twelvelabs)r   r  r   
BedrockLLMget_bedrock_invoke_providerr   AmazonConverseConfigAmazonBedrockOpenAIConfig5litellm.llms.bedrock.chat.invoke_agent.transformationr0  2litellm.llms.bedrock.chat.agentcore.transformationr1  AmazonTitanConfigAmazonAnthropicConfig get_legacy_anthropic_model_namesAmazonAnthropicClaudeConfigAmazonLlamaConfigAmazonAI21ConfigAmazonCohereConfigAmazonMistralConfigAmazonMoonshotConfigAmazonDeepSeekR1ConfigAmazonInvokeNovaConfigAmazonQwen3ConfigAmazonQwen2ConfigAmazonTwelveLabsPegasusConfigAmazonInvokeConfig)r   bedrock_routebedrock_invoke_providerr  r0  r1  s         r   get_bedrock_chat_configrU    s    %66u=M%00LL M  "007J 
"m&F++--	(	"0022	'	!	
 '((	+	%	
 %&& (*((**	 K	/,,MMOP 00226688	 F	*.E.P((**	 F	*''))	 H	,))++	 I	-**,,	 J	.++--	 M	1--//	 F	*--//	 G	+((**	 G	+((**	 L	04466))++r   c                  (    e Zd ZdZdZd Zd ZddZy)BedrockEventStreamDecoderBasez:
    Base class for event stream decoding for Bedrock
    Nc                (    ddl m}  |       | _        y )Nr   )EventStreamJSONParser)botocore.parsersrY  parser)r/   rY  s     r   r0   z&BedrockEventStreamDecoderBase.__init__+  s    :+-r   c                    | j                   Cddlm} ddlm}  |       }|j                  dd      } ||      }|j                  d      | _         | j                   S )Nr   )Loader)ServiceModelrj   z	service-2ResponseStream)_response_stream_shape_cachebotocore.loadersr]  botocore.modelr^  load_service_model	shape_for)r/   r]  r^  loaderbedrock_service_dictbedrock_service_models         r   get_response_stream_shapez7BedrockEventStreamDecoderBase.get_response_stream_shape0  sc    ,,4/3XF#)#<#<!;$  %11E$F!0E0O0O 1D- 000r   c                |   |j                         }| j                  j                  || j                               }|d   dk7  r|d   j	                         }t        |t              r|j                  d      }nt        |t              r|}nd}|d   j                  d      }|dz   |z   }t        |d   t        |t              rt        j                  |      	      |	      d
|v r3|j                  d
      }|sy |j                  d      j	                         S |j                  d      }|sy |j	                         S )Nr`      bodyr_   r  rO   z:exception-type )r`   r_   chunkbytes)to_response_dictr[  parserh  decoder#   r%   r"   r(  r   jsondumps)r/   eventresponse_dictparsed_responsedecoded_bodyerror_messageexception_statusrm  s           r   _parse_message_from_eventz7BedrockEventStreamDecoderBase._parse_message_from_event@  s@   ..0++++499;
 '3.(0779L,- , 0 0 ;L#. , ",Y7;;<MN,s2]BM)-8 "-6 JJ}- 
 '  o%#''0E99W%,,..!%%f-E<<>!r   )rJ   r'  )r   r   r   __doc__r`  r0   rh  rz  r   r   r   rW  rW  $  s     $( .
1 ""r   rW  c                   | j                  d      }|sg S t        |t              r|S t        |t              r|j	                         }|j                  d      r_|j                  d      rN	 t        j                  |      }t        |t              r'|D cg c]  }t        |      j	                          c}S 	 |j                  d      D cg c]  }|j	                          c}S g S c c}w # t        j                  $ r Y Iw xY wc c}w )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[],)r"   r#   r$   r(  striprw   endswithrr  loadsJSONDecodeErrorr   )rO   anthropic_beta_headerparsedbetas       r   get_anthropic_beta_from_headersr  e  s     $KK(89 	 '.$$ '- 5 ; ; = ++C05J5S5S6
$9:fd+:@A&$CIOO-&AA , *?)D)DS)IJ)I

)IJJI B''  Ks*   +)C,  C'4C, D'C, ,DDc                      e Zd ZdZd ZddZddZ	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 	 	 ddZdddZ		 	 d	 	 	 	 	 	 	 	 	 ddZ
	 	 	 	 	 	 	 	 dd	Zy
)CommonBatchFilesUtilsz
    Common utilities for Bedrock batch and file operations.
    Provides shared functionality to reduce code duplication between batches and files.
    c                (    ddl m}  |       | _        y )Nr   )
BaseAWSLLM)base_aws_llmr  	_base_aws)r/   r  s     r   r0   zCommonBatchFilesUtils.__init__  s    ,#r   c                2    |j                  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)rw   )r/   r   s     r   'get_bedrock_model_id_from_litellm_modelz=CommonBatchFilesUtils.get_bedrock_model_id_from_litellm_model  s#     J'9r   c                    |j                  d      st        d|       |dd j                  dd      }t        |      dk7  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   )rw   
ValueErrorr   r   )r/   s3_uris3_partss      r   parse_s3_uriz"CommonBatchFilesUtils.parse_s3_uri  so       )6vh?@@!":##C+x=A6vh?@@{HQK''r   c                H   d|v r|d   r| j                  |d         S 	 | j                  |      \  }}|j                  d      rP|dd }|j                  d      }t	        |      dkD  r,dj                  |dd       }|j                  d      r|dd	 }|S y
# t        $ r Y y
w xY 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  rw   r   r   joinr  	Exception)r/   r  r8   bucket
object_key
model_partparts
model_names           r   extract_model_from_s3_file_pathz5CommonBatchFilesUtils.extract_model_from_s3_file_path  s     o%/'*B??( 	!%!2!26!:FJ $$%=>'_
"((-u:>!$%*!5J!**84%/_
%%
 ;	  	 ;		s   A4B 	B! B!c                ,   	 ddl m} ddlm} | j
                  j                  |d      }| j
                  j                  |j                  d      |j                  d      |j                  d	      ||j                  d
      |j                  d      |j                  d      |j                  d      |j                  d      	      }	|j                         }
|
dk(  rd}i }n-t        |t              rddl} |j                  |      }n|}ddi} ||	||      } ||
|||      }|j                  |       |j                         }t        |j                         t        |t"              r|j%                  d      fS |fS # t        $ r t	        d      w xY w)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  )r8   r   rp   rq   rr   r   r   r   r   aws_sts_endpoint)	rp   rq   rr   r3   r   r   r   r   r  GETNzContent-Typezapplication/json)methodurldatarO   zutf-8)botocore.authr  botocore.awsrequestr  ImportErrorr  _get_aws_region_nameget_credentialsr"   upperr#   r%   rr  rs  add_authpreparerO   r(  encode)r/   ro   r  rs   r8   r  r  r  r3   credentialsmethod_upperrequest_datarO   rr  sigv4rQ   preppeds                    r   sign_aws_requestz&CommonBatchFilesUtils.sign_aws_request  s   *	Y/6
 ..==+2 > 
 nn44-112EF"1"5"56M"N-112EF+,001CD,001CD)--o>#2#6#67O#P,001CD 5 

 ||~5 LG$%)tzz$/#%'9:G +|_E\g
 	w//# !,, (
 	
 	
 	
W  	YWXX	Ys   E> >Fc                X    ddl m} t        |j                               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_idjob_names         r   generate_unique_job_namez.CommonBatchFilesUtils.generate_unique_job_name.  s5     	'

%bq)	 XWYK0r   c                4   ddl }ddlm} |j                  d      xs( |j                  d      xs t	        j
                  |      }|st        d| d      t        |j                               }t        |j                               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  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   r8   bucket_env_var
key_prefixr  r  bucket_name	timestampr  r  s              r   !get_s3_bucket_and_key_from_configz7CommonBatchFilesUtils.get_s3_bucket_and_key_from_configC  s    & 	& /0 )""#34)yy( 	
 PQ_P``hi 
 		$	

%bq)	"|1YKq<
J&&r   c                    t        |||      S )z3
        Get Bedrock-specific error class.
        )r`   r_   rO   )r   )r/   rx  r`   rO   s       r   get_error_classz%CommonBatchFilesUtils.get_error_classl  s     #]G
 	
r   Nr)  )r  r(  rJ   tuple)r  r(  r8   r%   rJ   r(  )POST)ro   r(  r  z-Union[str, dict, 'BedrockCreateBatchRequest']rs   r(  r8   r%   r  r(  rJ   r  )r   )r   r(  r   r(  rJ   r(  )AWS_S3_BUCKET_NAMEr   )
r   r%   r8   r%   r  r(  r  r(  rJ   r  )rx  r(  r`   r  rO   zUnion[Dict, httpx.Headers]rJ   r   )r   r   r   r{  r0   r  r  r  r  r  r  r  r   r   r   r  r    s    
&(,$;$;,0$;	$;X H
H
 <H
 	H

 H
 H
 
H
T2 3#'''' '' 	''
 '' 
''R
 
/2
=W
	
r   r  )r'   r%   rJ   None)rJ   zUnion[bool, str])NNNNNNNNNNN)rp   r'  rq   r'  r3   r'  r   r'  r   r'  r   r'  r   r'  r   r'  r   zOptional[dict]r   z%Optional[Union[float, httpx.Timeout]])r   r(  rJ   r(  rK   r)  r*  )r   r(  )rO   r%   rJ   rL   )4
__future__r   rr  r  typingr   r   r   r   r   r	   litellm.types.llms.bedrockr
   r|   r   7litellm.llms.base_llm.anthropic_messages.transformationr    litellm.llms.base_llm.base_utilsr   r   )litellm.llms.base_llm.chat.transformationr   litellm.secret_managers.mainr   litellm.types.llms.openair   r   r   r   r)   r+   rV   r[   r   r   r   r   __annotations__r   r   r   r   r   r   r   7litellm.llms.bedrock.count_tokens.bedrock_token_counterr   r   rU  rW  r  r  r   r   r   <module>r     s   "  	 F FD   P F 3:	# 	
  %*H
 H
V '++/%)26&*&*#',0$(59s$s )s #	s
 #0s $s $s !s *s "s 3sl# #4& 04 , 3#@
1%PJ@ XV' VrB,J>" >"B&Rf
 f
r   