
    hAD                        d Z ddlZddlZddlmZmZmZmZmZ ddl	Z	ddl
Z
ddlmZ ddlmZ ddlmZ erddlmZ  G d d	e      Z G d
 d      Zd Z	 	 	 	 	 	 	 	 	 	 	 d!dee   dee   dee   dee   dee   dee   dee   dee   dee   deeee	j2                  f      fdZ G d d      ZdedefdZ G d de      Z G d d       Zy)"zF
Common utilities used across bedrock chat/embedding/image generation
    N)TYPE_CHECKINGListLiteralOptionalUnion)BaseLLMModelInfo)BaseLLMException)
get_secret)AllMessageValuesc                       e Zd Zy)BedrockErrorN)__name__
__module____qualname__     ]/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/bedrock/common_utils.pyr   r      s    r   r   c                       e Zd Zd ZdefdZdedefdZdee   fdZ	dee   fdZ
dee   fd	Zdee   fd
Zdee   fdZdee   fdZy)AmazonBedrockGlobalConfigc                      y Nr   selfs    r   __init__z"AmazonBedrockGlobalConfig.__init__   s    r   returnc                 
    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_params   s     011r   non_default_paramsoptional_paramsc                 p    | j                         }|j                         D ]  \  }}||v s||||   <    |S r   )r   items)r   r    r!   mapped_paramsparamvalues         r   map_special_auth_paramsz1AmazonBedrockGlobalConfig.map_special_auth_params"   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_regions)   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_regions2   s    
 	
r   c                     dgS )Nz	sa-east-1r   r   s    r   r-   z(AmazonBedrockGlobalConfig.get_sa_regions@   s
    }r   c                 
    g dS )r0   )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_regionsC   s    	
 		
r   c                     dgS )Nzca-central-1r   r   s    r   r,   z(AmazonBedrockGlobalConfig.get_ca_regionsR   s    r   c                 
    g dS )r0   )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_regionsU   s    
 	
r   N)r   r   r   r   dictr   r'   r   strr.   r+   r-   r*   r,   r)   r   r   r   r   r      s    2 2$ QU 
c 

S	 
S	 
S	 
 S	  
S	 
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)r#   headers
add_header)requestkwargsheader_nameheader_valuer9   s       r   callbackz#add_custom_header.<locals>.callbackf   s,    )0%KOO&&{LA *9r   r   )r9   r?   s   ` r   add_custom_headerr@   c   s    B
 Or   aws_access_key_idaws_secret_access_keyr   aws_bedrock_runtime_endpointaws_session_nameaws_profile_nameaws_role_nameaws_web_identity_tokenextra_headerstimeoutc           
      `   t        dd       }t        dd       }||||||||g}t        |      D ](  \  }}|s	|j                  d      st        |      ||<   * |\  }}}}}}}}t        j                  dt
        j                        }| 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                         }|p|n|lt        |      }|t        dd      |j#                  d      }|j%                  |||d      }|j#                  d|d   d   |d   d   |d   d   | |||      }n|U|S|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t1        |	             |S )NAWS_REGION_NAME
AWS_REGIONzos.environ/
SSL_VERIFYzRAWS 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.stsi  )RoleArnRoleSessionNameWebIdentityTokenDurationSecondsbedrock-runtimeCredentialsAccessKeyIdSecretAccessKeySessionToken)service_namerA   rB   aws_session_tokenr   endpoint_urlconfigverify)rA   rB   )rT   rU   )r]   rA   rB   r   r_   r`   ra   )profile_name)r]   r   r_   r`   ra   zbefore-sign.bedrock-runtime.*)r
   	enumerate
startswithosgetenvlitellm
ssl_verifyr   boto3
isinstancefloatsessionConfighttpxTimeoutconnectreadclientassume_role_with_web_identityassume_roleSessionmetaeventsregisterr@   )r   rA   rB   r   rC   rD   rE   rF   rG   rH   rI   litellm_aws_region_namestandard_aws_region_nameparams_to_checkir%   rh    env_aws_bedrock_runtime_endpointr_   ri   r`   
oidc_token
sts_clientsts_responserr   s                            r   init_bedrock_clientr   n   s    )):DA),= 	$	O o.5U%%m4!+E!2OA / 		$ <););<J 	%	 -	!.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   r   zModelResponseIterator.__init__%  s    ,r   c                     | S r   r   r   s    r   __iter__zModelResponseIterator.__iter__*      r   c                 L    | j                   rt        d| _         | j                  S NT)r   StopIterationr   r   s    r   __next__zModelResponseIterator.__next__-  s"    <<"""r   c                     | S r   r   r   s    r   	__aiter__zModelResponseIterator.__aiter__4  r   r   c                 T   K   | j                   rt        d| _         | j                  S wr   )r   StopAsyncIterationr   r   s    r   	__anext__zModelResponseIterator.__anext__7  s&     <<$$"""s   &(N)r   r   r   r   r   r   r   r   r   r   r   r   r   $  s    
##r   r   response_tool_namer   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.
    )rg   bedrock_tool_name_mappings
cache_dict)r   s    r   get_bedrock_tool_namer   >  s:     W??JJJ$??JJ
 r   c                   ~   e Zd Z e       Zej                         Zeddee	   dee	   fd       Z
eddee	   dee	   fd       Z	 	 ddede	d	ed
   dededee	   dee	   defdZ	 ddee	   dee	   dee	   fdZede	de	fd       Zede	de	fd       Zede	de	fd       Zedee	   fd       Zede	ded   fd       Zy)BedrockModelInfoNapi_baser   c                     | S )z7
        Get the API base for the given model.
        r   )r   s    r   get_api_basezBedrockModelInfo.get_api_baseT  s	    
 r   api_keyc                     | S )z6
        Get the API key for the given model.
        r   )r   s    r   get_api_keyzBedrockModelInfo.get_api_key[  s	    
 r   r9   modelmessagesr   r!   litellm_paramsc                     |S r   r   )r   r9   r   r   r!   r   r   r   s           r   validate_environmentz%BedrockModelInfo.validate_environmentb  s	     r   c                     g S r   r   )r   r   r   s      r   
get_modelszBedrockModelInfo.get_modelsn  s	     	r   c                 R    d| j                         v r| j                  d      d   S | S )a[  
        Extract the model name from an AWS Bedrock ARN.
        Returns the string after the last '/' if 'arn' is in the input string.

        Args:
            arn (str): The ARN string to parse

        Returns:
            str: The extracted model name if 'arn' is in the string,
                otherwise returns the original string
        arn/)lowersplitr   s    r   extract_model_name_from_arnz,BedrockModelInfo.extract_model_name_from_arns  s+     EKKM!;;s#B''r   c                     | j                  d      r| j                  dd      d   } | j                  d      r| j                  dd      d   } | j                  d      r| j                  dd      d   } | S )Nzbedrock/r      	converse/invoke/)rd   r   r   s    r   "get_non_litellm_routing_model_namez3BedrockModelInfo.get_non_litellm_routing_model_name  sp    J'KKQ'*EK(KKQ'*EI&KKQ'*Er   c                    t         j                  |       } t         j                  |       } | j                  dd      d   }| j                  dd      d   }|t         j	                         v r| j                  dd      d   S |t         j
                  v r3t        | j                  dd            dkD  r| j                  dd      d   S | S )z
        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"
        AND "meta.llama3-2-11b-instruct-v1:0" -> "meta.llama3-2-11b-instruct-v1"
        r   .r   r   r   )r   r   r   r   (_supported_cross_region_inference_regionall_global_regionslen)r   potential_regionalt_potential_regions      r   get_base_modelzBedrockModelInfo.get_base_model  s     !CC%CP <<UC ;;sA.q1${{32 

 HHJK ;;sA&q)) $4$G$GGEKKQ'(1,;;sA&q))r   c                  
    g dS )zZ
        Abbreviations of regions AWS Bedrock supports for cross region inference
        )useuapacr   r   r   r   r   z9BedrockModelInfo._supported_cross_region_inference_region  s
    
 $#r   )converseinvokeconverse_likeagentc                     t         j                  |       }t         j                  |       }d| v ryd| v ryd| v ryd| v ry|t        j                  v s|t        j                  v ryy)	z<
        Get the bedrock route for the given model.
        r   r   r   r   r   r   zagent/r   )r   r   r   rg   bedrock_converse_models)r   
base_model	alt_models      r   get_bedrock_routez"BedrockModelInfo.get_bedrock_route  su     &44U;
$GGeGT	%"E!'999G;;;r   r   )NN)r   r   r   r   global_configr.   r   staticmethodr   r6   r   r   r5   r   r   r   r   r   r   r   r   r   r   r   r   r   r   P  s   -/M&668x}    Xc] hsm   "&"&

 
 )*	

 
 
 #
 3-
 

 HL}7?}	c
 3 3    
# 
# 
 
 c c  < $d3i $ $ 	?	@ r   r   c                   2    e Zd ZdZdZd Zd Zdee   fdZ	y)BedrockEventStreamDecoderBasez:
    Base class for event stream decoding for Bedrock
    Nc                 (    ddl m}  |       | _        y )Nr   )EventStreamJSONParser)botocore.parsersr   parser)r   r   s     r   r   z&BedrockEventStreamDecoderBase.__init__  s    :+-r   c                     | j                   Cddlm} ddlm}  |       }|j                  dd      } ||      }|j                  d      | _         | j                   S )Nr   )Loader)ServiceModelrX   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_shape  sc    ,,4/3XF#)#<#<!;$  %11E$F!0E0O0O 1D- 000r   r   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 )NrO      bodyrN    r9   z:exception-type )rO   rN   chunkbytes)to_response_dictr   parser   decoderj   r5   getr6   r   jsondumps)r   eventresponse_dictparsed_responsedecoded_bodyerror_messageexception_statusr   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   )
r   r   r   __doc__r   r   r   r   r6   r   r   r   r   r   r     s)     $( .
1 ""(3- ""r   r   )NNNNNNNNNNN)r   r   re   typingr   r   r   r   r   rn   rg    litellm.llms.base_llm.base_utilsr   )litellm.llms.base_llm.chat.transformationr	   litellm.secret_managers.mainr
   litellm.types.llms.openair   r   r   r@   r6   r5   rk   ro   r   r   r   r   r   r   r   r   <module>r      sP    	 @ @   = F 3:	# 	H
 H
V '++/%)26&*&*#',0$(59s}s $C=s c]	s
 #+3-s sms sms C=s %SMs D>s eE5==012sl# #4c c $}' }@>" >"r   