o
    ưih                     @   s   d Z ddlZddlZddl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ZddlmZ ddlmZ ddlmZmZmZmZ ddlmZ ddlmZm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( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 G dd de"Z1dS )z9
Handles embedding calls to Bedrock's `/invoke` endpoint
    N)AnyCallableListOptionalTupleUnionget_args)#BEDROCK_EMBEDDING_PROVIDERS_LITERAL)	embedding)AsyncHTTPHandlerHTTPHandler_get_httpx_clientget_async_httpx_client)
get_secret)AmazonEmbeddingRequestCohereEmbeddingRequest)EmbeddingResponseLlmProviders   )
BaseAWSLLM)BedrockError   )AmazonNovaEmbeddingConfig)AmazonTitanG1Config)&AmazonTitanMultimodalEmbeddingG1Config)AmazonTitanV2Config)BedrockCohereEmbeddingConfig) TwelveLabsMarengoEmbeddingConfigc                   @   s   e Zd Zdedeeef fddZdd Zde	e
 de	eeejf  d	ed
ededefddZde	e de	eeejf  d	ed
ededefddZ		d-dee dedede	e de	ee  de	e fddZ		d.de	e
 de	eeejf  dee dede	e dededededede	e de	e fdd Z		d.de	e de	eeejf  dee dede	e dededededede	e de	e fd!d"Z	d/ded#ee d	e	e d$ed%ede	ee
ef  de	eeejf  d&e	e de	e ded'ede	e defd(d)Z	d/d*ededefd+d,ZdS )0BedrockEmbeddingoptional_paramsreturnc                 C   s  zddl m} W n ty   tdw |dd }|dd }|dd }|dd }|dd }|d	d }|d
d }	|dd }
|dd }|d u rttdd }|d ur^t|tr^|}tdd }|d urnt|trn|}|d u rtd}| j||||||	||
|d	}||fS )Nr   )Credentials7Missing boto3 to call bedrock. Run 'pip install boto3'.aws_secret_access_keyaws_access_key_idaws_session_tokenaws_region_nameaws_role_nameaws_session_nameaws_profile_nameaws_web_identity_tokenaws_sts_endpointZAWS_REGION_NAMEZ
AWS_REGIONz	us-west-2)	r$   r#   r%   r&   r(   r)   r'   r*   r+   )Zbotocore.credentialsr!   ImportErrorpopr   
isinstancestrZget_credentials)selfr   r!   r#   r$   r%   r&   r'   r(   r)   r*   r+   Zlitellm_aws_region_nameZstandard_aws_region_namecredentials r2   [/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/bedrock/embed/embedding.py_load_credentials)   sN   



z"BedrockEmbedding._load_credentialsc                    s   d S Nr2   r0   r2   r2   r3   async_embeddings]   s   z!BedrockEmbedding.async_embeddingsclienttimeoutapi_baseheadersdatac           
   
   C   s   |d u s	t |ts'i }|d ur"t |tst |trt|}||d< t|}n|}z|j||t	|d}|
  W | S  tjyV } z|jj}	t|	|jjdd }~w tjyc   tdddw )Nr9   urlr;   r<   status_codemessage  Timeout error occurred.)r.   r   floatinthttpxTimeoutr   postjsondumpsraise_for_statusHTTPStatusErrorresponser@   r   textTimeoutException
r0   r8   r9   r:   r;   r<   _paramsrM   errZ
error_coder2   r2   r3   _make_sync_call`   s&   


z BedrockEmbedding._make_sync_callc           
   
      s   |d u s
t |ts,i }|d ur#t |tst |trt|}||d< t|tjj	d}n|}z|j
||t|dI d H }|  W | S  tjy^ } z|jj}	t|	|jjdd }~w tjyk   tdddw )Nr9   )paramsllm_providerr=   r?   rB   rC   )r.   r   rD   rE   rF   rG   r   litellmr   BEDROCKrH   rI   rJ   rK   rL   rM   r@   r   rN   rO   rP   r2   r2   r3   _make_async_call|   s,   

z!BedrockEmbedding._make_async_callFNresponse_listmodelprovideris_async_invoke
batch_datac                 C   sf  d}|rdt |dkrdd|d v rd|dkrt j|d |d}n|dkr.t j|d |d}nx|d dd}dd	lm}m}	 |g dd
d}
|	ddd}ddlm	} | }t
|d| t|
g|||d}nB|dkrrt j|||d}n4|dkrt j||d}n'|dkrt j||d}n|dkrt j||d}n|dkrt j|||d}|du rtd||S )zc
        Transforms the response from the Bedrock embedding provider to the OpenAI format.
        Nr   ZinvocationArnr   
twelvelabs)rM   rZ   nova )	EmbeddingUsager
   )r
   indexobject)Zprompt_tokensZtotal_tokens)HiddenParamsZ_invocation_arn)r<   rZ   usagehidden_paramsamazon.titan-embed-image-v1)rY   rZ   r]   amazon.titan-embed-text-v1)rY   rZ   amazon.titan-embed-text-v2:0z?Unable to map model response to known provider format. model={})lenr   Z _transform_async_invoke_responser   getlitellm.types.utilsra   rb   Zlitellm.types.llms.basere   setattrr   r   _transform_responser   r   	Exceptionformat)r0   rY   rZ   r[   r\   r]   returned_responseinvocation_arnra   rb   r
   rf   re   rg   r2   r2   r3   ro      sz   z$BedrockEmbedding._transform_responser1   extra_headersendpoint_urlr&   logging_objapi_keyc              
   C   s   g }|D ]T}ddi}|d urddi|}| j ||||t|||d}|	j|d||j|jdd t|dr;t|jni }| j|||j||d}|	j	|d|d	|id
 |
| q| j|||
||dS NContent-Typeapplication/jsonr1   r&   rt   ru   r<   r;   rw   r`   )complete_input_dictr:   r;   inputrw   additional_argsr;   )r8   r9   r:   r;   r<   r|   r~   rw   original_responser   )rY   rZ   r[   r\   r]   )get_request_headersrI   rJ   pre_callr>   r;   hasattrdictrS   	post_callappendro   r0   r8   r9   r]   r1   rt   ru   r&   rZ   rv   r[   rw   r\   	responsesr<   r;   preppedheaders_for_requestrM   r2   r2   r3   _single_func_embeddings   sX   		z(BedrockEmbedding._single_func_embeddingsc              
      s   g }|D ]W}ddi}|d urddi|}| j ||||t|||d}|	j|d||j|jdd t|dr<t|jni }| j|||j||dI d H }|	j	|d|d	|id
 |
| q| j|||
||dS rx   )r   rI   rJ   r   r>   r;   r   r   rX   r   r   ro   r   r2   r2   r3   _async_single_func_embeddings=  sZ   	z.BedrockEmbedding._async_single_func_embeddingsr~   model_responseprint_verbose
aembeddinglitellm_paramsc           "         sH    |\}}|dd p|}tjj|dd} jd|i||d}d|v }|r.|ddd} |}|d u rEtd| d	t	t
t t|} fd
d| D }|dd  d }d }|dkrmt j|||d}n|dkr|dv rg }|D ]8}|dkrt j||d}n$|dkrt j||d}n|dkrt j||d}n
td|g d|| qyn=|dkrg }|D ]}t j|||||dd}|| qn|dkrg }|D ]}t j|||||dd}|| qڈ j||dd |d\}}|r| d}n| d| d}|d ur^|
r5 j|d ur&t|tr&|nd |	||||||||||dS  j|d urDt|trD|nd |	||||||||||d}|d u r\td |S |d u rgtd d!d"i}|d urvd!d"i|} j||||t !|||d#} t"| d$rt#| j$ni }!t%|||||||| j&d |
|	||!d%S )&Nmodel_idr`   safer&   )r   rZ   r   zasync_invoke/r   z:Unable to determine bedrock embedding provider for model: z. Supported providers: c                    s$   i | ]\}}|   jvr||qS r2   )lowerZaws_authentication_params.0kvr6   r2   r3   
<dictcomp>  s
    z/BedrockEmbedding.embeddings.<locals>.<dictcomp>userZcohere)rZ   r~   inference_paramsZamazon)rh   ri   rj   rh   )r~   r   ri   rj   z(Unmapped model. Received={}. Expected={}r^   output_s3_uri)r~   r   Zasync_invoke_router   r   r_   aws_bedrock_runtime_endpointr:   r   r&   z/async-invokez/model/z/invoke)r8   r9   r]   r1   rt   ru   r&   rZ   rv   rw   r[   r\   z)Unable to map Bedrock request to providerry   rz   r{   r;   )rZ   r~   r   rv   r   encodingr<   Zcomplete_api_baserw   r   r9   r8   r;   )'r4   r-   urllibparsequoteZ_get_aws_region_namereplaceZget_bedrock_embedding_providerrp   listr   r	   copydeepcopyitemsr   Z_transform_requestr   r   r   rq   r   r   rl   r   get_runtime_endpointr   r.   r   r   r   r   rI   rJ   r   r   r;   cohere_embeddingr>   )"r0   rZ   r~   r:   r   r   r   rv   r8   r9   r   rt   r   r   rw   r1   r&   Zunencoded_model_idZmodelIdZhas_async_invoker[   r   r<   r]   iZtransformed_requestZtwelvelabs_requestZnova_requestru   Zproxy_endpoint_urlrr   r;   r   r   r2   r6   r3   
embeddings  s:  




	




zBedrockEmbedding.embeddingsrs   c                    s  |  |\}}| jd|d|d\}}ddlm} ||dd}	|d d	|	 }
d
di}zddlm} ddlm	} W n t
yH   t
dw |d|
d|d}||d|}|| | }|dur||j}ddd | D }d}|d7 }||j d7 }|| d7 }|j|dd|i|j|j|dd ttjd}|j|j|jdI dH }|dur|j|d|dd|iid |jd kr| S td!|j d"|j )#aj  
        Get the status of an async invoke job using the GetAsyncInvoke operation.

        Args:
            invocation_arn: The invocation ARN from the async invoke response
            aws_region_name: AWS region name
            **kwargs: Additional parameters (credentials, etc.)

        Returns:
            dict: Status response from AWS Bedrock
        Nr   r   r   )r   r`   r   /z/async-invoke/ry   rz   )	SigV4Auth)
AWSRequestr"   GET)methodr>   r<   r;   Zbedrock c                 S   s"   g | ]\}}d | d| dqS )z-H 'z: 'r2   r   r2   r2   r3   
<listcomp>  s   " z=BedrockEmbedding._get_async_invoke_status.<locals>.<listcomp>z!

GET Request Sent from LiteLLM:
zcurl -X GET \
z \

rs   )r|   r:   r;   Zrequest_strr}   )rU   )r>   r;   r|   r      z#Failed to get async invoke status: z - )r4   r   rl   urllib.parser   rstripZbotocore.authr   Zbotocore.awsrequestr   r,   Zadd_authprepareZ_get_masked_headersr;   joinr   r>   r   r   r   rW   r   r@   rI   rp   rN   )r0   rs   r&   rv   kwargsr1   _ru   r   Zencoded_arnZ
status_urlr;   r   r   requestZsigv4r   Zmasked_headersZformatted_headersZcustom_curlr8   rM   r2   r2   r3   _get_async_invoke_statusN  s   



z)BedrockEmbedding._get_async_invoke_status)FN)NFr5   )__name__
__module____qualname__r   r   r   r/   r4   r7   r   r   r   rD   rF   rG   rS   r   rX   r   r	   boolr   ro   r   r   r   r   r   r2   r2   r2   r3   r   (   s   

4

$

j	

P	

U	

 Mr   )2__doc__r   rI   r   r   typingr   r   r   r   r   r   r   rF   rV   Zlitellm.constantsr	   Z!litellm.llms.cohere.embed.handlerr
   r   Z&litellm.llms.custom_httpx.http_handlerr   r   r   r   Zlitellm.secret_managers.mainr   Zlitellm.types.llms.bedrockr   r   rm   r   r   Zbase_aws_llmr   Zcommon_utilsr   Zamazon_nova_transformationr   Zamazon_titan_g1_transformationr   Z&amazon_titan_multimodal_transformationr   Zamazon_titan_v2_transformationr   Zcohere_transformationr   Z!twelvelabs_marengo_transformationr   r   r2   r2   r2   r3   <module>   s,    $