o
    ưi:(                    @   s  U d Z ddlZddlZddl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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mZmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z' ddl(m)Z)m*Z*m+Z+m,Z, ddl-T ddl.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl4m8Z9 ddl4m:Z:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@ ddlAmBZB ddlCmDZDm&Z&mEZE daFedddZGeeHd< ddlImJZJ ddlKmLZL eJ ZMG dd dZN	 	 		!d>d"e
e) d#eOd$ePd%eOd&eOd'eQd(ed)eRd*e
eR d+e
ejS d,eTfd-d.ZU	 	 		!d>d"e
e* d#eOd$ePd%eOd/e
eV d&eOd'eQd(ed)eRd*e
eR d+e
ejS d,eTfd0d1ZWG d2d3 d3eBZXd4d5 ZYG d6d7 d7ZZG d8d9 d9eZZ[G d:d; d;eZZ\G d<d= d=Z]dS )?z
TODO: DELETE FILE. Bedrock LLM is no longer used. Goto `litellm/llms/bedrock/chat/invoke_transformations/base_invoke_transformation.py`
    N)partial)AsyncIteratorCallableIteratorOptionalTuplecastget_args)verbose_logger)uuid)InMemoryCache)RESPONSE_FORMAT_TOOL_NAME)map_finish_reason)Logging)track_llm_api_timing)cohere_message_pt construct_tool_use_system_promptcontains_tagcustom_promptextract_between_tagsparse_xml_paramsprompt_factory)ModelResponseIterator)AsyncHTTPHandlerHTTPHandler_get_httpx_clientget_async_httpx_client)*)#ChatCompletionRedactedThinkingBlockChatCompletionThinkingBlockChatCompletionToolCallChunk#ChatCompletionToolCallFunctionChunkChatCompletionUsageBlock)ChatCompletionMessageToolCallChoicesDelta)GenericStreamingChunk)ModelResponseModelResponseStreamStreamingChoicesUsage)CustomStreamWrapper
get_secret   )
BaseAWSLLM)BedrockErrorr   get_bedrock_tool_name2   iX  )Zmax_size_in_memoryZdefault_ttlbedrock_tool_name_mappings)AmazonConverseConfig)AmazonBedrockOpenAIConfigc                   @   s  e Zd ZU dZdZeee  ed< dZ	ee
 ed< dZee ed< dZee ed< dZee ed< dZee ed< dZee ed	< dZee ed
< dZee ed< dZee ed< dZee ed< dZee
 ed< dZeee  ed< dZee
 ed< 														dde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 dee dee
 dee dee
 ddfddZedd Zdee fddZdededefddZdS )AmazonCohereChatConfigzv
    Reference - https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-cohere-command-r-plus.html
    N	documentssearch_queries_onlypreamble
max_tokenstemperaturepkprompt_truncationfrequency_penaltypresence_penaltyseedreturn_promptstop_sequencesraw_promptingreturnc                 C   s>   t   }| D ]\}}|dkr|d urt| j|| q	d S )Nself)localscopyitemssetattr	__class__)rE   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   Zlocals_keyvalue rM   _/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/bedrock/chat/invoke_handler.py__init__h   s   
zAmazonCohereChatConfig.__init__c                 C   s   dd | j  D S )Nc                 S   s>   i | ]\}}| d st|tjtjttfs|dur||qS )__N)
startswith
isinstancetypesFunctionTypeBuiltinFunctionTypeclassmethodstaticmethod.0r<   vrM   rM   rN   
<dictcomp>   s     z5AmazonCohereChatConfig.get_config.<locals>.<dictcomp>)__dict__rH   )clsrM   rM   rN   
get_config~   s   z!AmazonCohereChatConfig.get_configc                 C   s   g dS )N)r9   max_completion_tokensstreamstopr:   top_pr>   r?   r@   ra   toolsZtool_choicerM   rE   rM   rM   rN   get_supported_openai_params   s   z2AmazonCohereChatConfig.get_supported_openai_paramsnon_default_paramsoptional_paramsc                 C   s   |  D ]M\}}|dks|dkr||d< |dkr||d< |dkr,t|tr(|g}||d< |dkr4||d< |dkr<||d< |d	krD||d	< |d
krL||d
< 	 ||d< q|S )Nr9   r_   r`   ra   rB   r:   rb   r;   r>   r?   r@   )rH   rR   str)rE   rf   rg   paramrL   rM   rM   rN   map_openai_params   s(   

z(AmazonCohereChatConfig.map_openai_params)NNNNNNNNNNNNNN) __name__
__module____qualname____doc__r6   r   ListZDocument__annotations__r7   boolr8   rh   r9   intr:   floatr;   r<   r=   r>   r?   r@   rA   rB   rC   rO   rV   r^   re   dictrj   rM   rM   rM   rN   r5   T   s   
 
	


r5   F   clientapi_baseheadersdatamodelmessageslogging_objfake_stream	json_modebedrock_invoke_providerstream_chunk_sizec                    s  z| d u r!t tjj|r|jr|jdrd|jdind d} | j|||| |dI d H }|jdkr<t|j|j	d|rYt
 j||t d|i d||tjd
}t||d	}n8|	d
krnt|d|d}||j|
d}n#|	dkrt|dd}||j|
d}nt||d}||j|
d}|j|ddd|id |W S  tjy } z|jj}t||jj	dd }~w tjy   tddd ty } ztdt|dd }~ww )N
ssl_verify)llm_providerparamsrx   ry   r`   r|      status_codemessageT 
rz   responsemodel_responser`   r|   rg   api_keyry   r{   encodingr   r~   	anthropicFrz   sync_streamr~   
chunk_sizedeepseek_r1rz   r   rz   r~   first stream response receivedcomplete_input_dictinputr   original_responseadditional_args  Timeout error occurred.  )r   litellmLlmProvidersBEDROCKlitellm_paramsgetpostr   r/   textr3   _transform_responser'   r   MockResponseIterator"AmazonAnthropicClaudeStreamDecoderaiter_bytesAmazonDeepSeekR1StreamDecoderAWSEventStreamDecoder	post_callhttpxHTTPStatusErrorr   TimeoutException	Exceptionrh   )rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   completion_streamdecodererr
error_codeerM   rM   rN   	make_call   s   
	



r   signed_json_bodyc                 C   s  z| d u rt |r|jr|jdrd|jdind d} | j|||d ur'|n|| |d}|jdkr;t|j|jd|rXt j	||t
 d|i d||tjd
}t||	d	}n8|
d
krmt|d|	d}||j|d}n#|
dkrt|dd}||j|d}nt||	d}||j|d}|j|ddd|id |W S  tjy } z|jj}t||jjdd }~w tjy   tddd ty } ztdt|dd }~ww )Nr   )r   r   r   r   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r/   r   r   r3   r   r'   r   r   r   
iter_bytesr   r   r   r   r   r   r   r   rh   )rv   rw   rx   ry   r   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   rM   rM   rN   make_sync_call  s   




r   c                       s  e Zd ZdZd' fddZededefddZde	ee
e f fd	d
Zdedejdede
e dedededeeef dedeeef fddZ				d(dedede
e dedededededede
eeejf  de
e de
eeef  deeef fddZddi dfdedededededede
eeejf  dedede
e deeef fddZe ddi dd fdedededededede
eeejf  dedede
e d!edefd"d#Zed$ede
e j! fd%d&Z"  Z#S ))
BedrockLLMa  
    Example call

    ```
    curl --location --request POST 'https://bedrock-runtime.{aws_region_name}.amazonaws.com/model/{bedrock_model_name}/invoke'         --header 'Content-Type: application/json'         --header 'Accept: application/json'         --user "$AWS_ACCESS_KEY_ID":"$AWS_SECRET_ACCESS_KEY"         --aws-sigv4 "aws:amz:us-east-1:bedrock"         --data-raw '{
        "prompt": "Hi",
        "temperature": 0,
        "p": 0.9,
        "max_tokens": 4096
        }'
    ```
    rD   Nc                    s   t    d S N)superrO   rd   rJ   rM   rN   rO        zBedrockLLM.__init__rz   c                    s&   |    g d}t fdd|D S )aZ  
        Check if the model uses the Claude Messages API (Claude 3+).

        Handles:
        - Regional prefixes: eu.anthropic.claude-*, us.anthropic.claude-*
        - Claude 3 models: claude-3-haiku, claude-3-sonnet, claude-3-opus, claude-3-5-*, claude-3-7-*
        - Claude 4 models: claude-opus-4, claude-sonnet-4, claude-haiku-4
        )zclaude-3zclaude-opus-4zclaude-sonnet-4zclaude-haiku-4c                 3   s    | ]}| v V  qd S r   rM   )rY   Z	indicatorZmodel_lowerrM   rN   	<genexpr>  s    z:BedrockLLM.is_claude_messages_api_model.<locals>.<genexpr>)lowerany)rz   Zmessages_api_indicatorsrM   r   rN   is_claude_messages_api_model  s   z'BedrockLLM.is_claude_messages_api_modelc           	      C   s8  d}d }||v r"|| }t |d |dd|dd|d}|d fS |dks*|dkr5t||dd	}||fS |d
krDt||dd	}||fS |dksL|dkrWt||dd	}||fS |dkrad}||fS |dkrpt|d\}}||fS d}|D ]#}d|v r|d dkr||d  7 }qt||d  7 }qt||d  7 }qt||fS )Nr   Zrolesinitial_prompt_valuefinal_prompt_value)Z	role_dictr   r   r{   r   amazonbedrockrz   r{   custom_llm_providermistralmetallamaopenaicoherer{   roleusercontent)r   r   r   r   )	rE   rz   r{   providercustom_prompt_dictpromptchat_historyZmodel_prompt_detailsr   rM   rM   rN   convert_messages_to_prompt  sT   
z%BedrockLLM.convert_messages_to_promptr   r   r`   r|   rg   r   ry   r{   c           &   
   C   s*  |  |}|j|	||jd|id |
d|j  z| }W n ty-   t|jddw d }z>|dkr\d|v r@|d }n.d|v rZ|d d	 d }t|d d	 d
 |jd	 _n|dkr| 	|ri }d}d|v rd}|d D ]}|d 
dd ||d d < qu|
dd	 
dd }|d urtd|rtd|d	 }td|d	  }d| d}t||
|d d}tjdt  d|t|ddgd d}||jd	 _||jd< |du r|d ur|du r|
d t }t|jd	 d
d|jd	 _tj }|jd	 j|_g }|
dt|jd	   |
d t|  t|jd	 tjrt|jd	 jd!d d ur^t|jd	 jjtr^|jd	 jjD ]}i |  d"d	i}|!| qKt"t|jd	 jdd |jd	 jj#|d#}||_$|g|_t%|d$}|
d% tj&||d&|d'W S t|
d(d)|jd	 _tj'|d* d+ |d* d, |d* d+ |d* d,  d-}t(|d*| n|d. }|d( |jd	 _n|d/kr|
d0d	 
d1
d}n|d2ks|d3kr|d4 }n|d5krJd6|v rIt)|d6 d	krI|d6 d	 }d7|v r|d7 
d}n	d|v r|d }d
|v r&t|d
 |jd	 _d*|v rI|d* }tj'|
d8d	|
d9d	|
d:d	d-}t(|d*| n$|d;krd|d< d	 d }|d< d	 d( |jd	 _n
|
d=d	 
d>}W n ty }  ztd?*|jt+| ddd } ~ ww zF|d urt)|d	krt,|jd	 d7rt|jd	 jd!d d u r||jd	 j_-nt,|jd	 d7rt|jd	 jd!d d urnt W n ty }  ztd@*|t+| |j.dd } ~ ww |r5|d/kr5t }|jd	 j|jd	 _tj }|jd	 j|_tjj"t|jd	 jdd |jd	 jj#dA}||_$|g|_t%|d$}!t&|!|d&|d'S t,|d*rDt|d*d d u r|j/
dBd }"|j/
dCd }#t0|"p[tj1|	dD}$t0|#pltj1|jd	 jj-ddE}%t0t22 |_3||_4t'|$|%|$|% d-}t(|d*| |S t0t22 |_3||_4|S )FNr   r   zraw model_response: i  )r   r   r   r   Zgenerationsr   finish_reasonr   Frc   Tfunction
parametersnamer   ZinvokeZ	tool_namez<invoke>z	</invoke>)Zjson_schemaZcall_r   	arguments)idtyper   )
tool_callsr   r   z5INSIDE BEDROCK STREAMING TOOL CALLING CONDITION BLOCKra   z#type of model_response.choices[0]: ztype of streaming_choice: r   index)r   r   r   )r   zMReturns anthropic CustomStreamWrapper with 'cached_response' streaming objectcached_responser   rz   r   r|   stop_reasonr   usageZinput_tokensZoutput_tokensprompt_tokenscompletion_tokenstotal_tokens
completionai21completionsry   r   r   
generationr   choicesr   r   r   r   r   outputsresults
outputTextz&Error processing={}, Received error={}z(Error parsing received text={}.
Error-{})r   r   z x-amzn-bedrock-input-token-countz!x-amzn-bedrock-output-token-countr   )r   Zcount_response_tokens)5get_bedrock_invoke_providerr   r   jsonr   r/   r   r   r   r   r   r   r   stripr   r   Messager   uuid4dumpsr   Z_hidden_paramsr(   getattrutilsr)   r   r   rR   r$   r   listrt   appendr%   r   deltar   r+   r*   rI   lenformatrh   hasattrr   r   rx   rr   Ztoken_countertimecreatedrz   )&rE   rz   r   r   r`   r|   rg   r   ry   r{   print_verboser   r   Zcompletion_responser   json_schemas_is_function_calltoolZfunction_nameZfunction_arguments_strZfunction_arguments_messageZstreaming_model_responseZstreaming_choiceZ_tool_callsZ	tool_callZ
_tool_call	delta_objr   Z_usagechoicer   r   ZmriZbedrock_input_tokensZbedrock_output_tokensr   r   rM   rM   rN   process_response  s  































zBedrockLLM.process_responserw   r   r  acompletiontimeoutextra_headersrv   c           ?         s  zddl m} W n ty   tdw |	dd }|	dd}| |}| j|||	d}|	dd }|	d	d }|	d
d }|	dd }|	dd }|	dd }|	dd }|	dd }|	dd }|	dd }|	dd }|d u rtdd } | d urt| tr| }tdd }!|!d urt|!tr|!}|d u rd}| j	||||||||||d
}"| j
|||d\}#}$|d ur|du r|dkr|# d| d}#|$ d| d}$n|# d| d}#|$ d| d}$| ||||\}%}&t|	}'i }(|dkrV|dr*t  })|) D ]\}*}+|*|'vr|+|'|*< qd|%i|'},|&d ur#|&|,d < t|,}-ntj })|) D ]\}*}+|*|'vr@|+|'|*< q3|du rKd|'d< td!|%i|'}-n|d"kr| |rg g }.t|D ]\}/}0|0d# d$kr|.|0d%  |/ qitdkrd&|.|'d$< fd'd(t|D }t||d)d*}tj })|) D ]\}*}+|*|'vr|+|'|*< qd+|'v rd}1|'d+ D ]}2|2d, d-d |(|2d, d. < qt|'d+ d/}3|'d$d&|3 |'d$< |'d+ td0|i|'}-ntj })|) D ]\}*}+|*|'vr|+|'|*< q td!|%i|'}-n|dkr@tj  })|) D ]\}*}+|*|'vr4|+|'|*< q'td!|%i|'}-n|d1krgtj! })|) D ]\}*}+|*|'vr[|+|'|*< qNtd!|%i|'}-n|d2krtj" })|) D ]\}*}+|*|'vr|+|'|*< qut|%|'d3}-nc|d4ks|d5krtj# })|) D ]\}*}+|*|'vr|+|'|*< qtd!|%i|'}-n7|d6krt$ }4|4j%|d7  fd8d9|' D }5td0|i|5}-n|j&|d:d;|'id< t'd=d>(||d?d@dAi}6|d urd@dAi|}6| j)|"|||#|-|6dB}7|j&|d:|-|$|7j*dCd< |
rxt|t+r"d }|du rc|dkrc| j,d\i dD|d0|dE|-dF|$dG|dH|dI|dJ|dK|	dddL|dM|dN|7j*dO|dP|d|S | j-|||-|$|||||	||||7j*||dQS |d u st|t.ri }8|d urt|t/st|t0rt12|}||8dO< t3|8| _4n|| _4|d ur|du r|dkr| j4j5|$|7j*|-||dR}9|9j6dSkrt'|9j6t|97 d?t8|d7}:|:9|9j9|dT};t:|;|dU|dV}<|j;|d:|<d;|-idW |<S z| j4j5|$t<|7j*|-|dX}9|9=  W n( t1j>y$ }= z|=j?j6}>t'|>|=j?j@d?d }=~=w t1jAy2   t'dYdZd?w | jB||9||||	d:|-|||d[S )]Nr   )Credentialsz7Missing boto3 to call bedrock. Run 'pip install boto3'.r`   r   ru   )rz   r   rg   aws_secret_access_keyaws_access_key_idaws_session_tokenaws_region_nameaws_role_nameaws_session_nameaws_profile_nameaws_bedrock_runtime_endpointaws_web_identity_tokenaws_sts_endpointr   ZAWS_REGION_NAMEZ
AWS_REGIONz	us-west-2)
r  r  r  r  r  r  r  r  r  r   )rw   r  r  Tr   z/model/z/invoke-with-response-streamz/invoker   zcohere.command-rr   r   r   r   r   systemr   
c                    s   g | ]
\}}| vr|qS rM   rM   )rY   ji)system_prompt_idxrM   rN   
<listcomp>  s    z)BedrockLLM.completion.<locals>.<listcomp>Zanthropic_xmlr   rc   r   r   r   )rc   r{   r   r   )Z	inputTextZtextGenerationConfigr   r   r   rz   c                    s   i | ]\}}| v r||qS rM   rM   rX   )supported_paramsrM   rN   r[     s    z)BedrockLLM.completion.<locals>.<dictcomp>r   r   )r   r   r   i  zqBedrock Invoke HTTPX: Unknown provider={}, model={}. Try calling via converse route - `bedrock/converse/<model>`.r   zContent-Typezapplication/json)credentialsr  r  endpoint_urlry   rx   )r   rw   rx   rz   ry   rw   r   r  r   r|   rg   r   	logger_fnrx   r  rv   )rz   r{   ry   rw   r   r  r   r|   rg   r`   r   r$  rx   r  rv   )urlrx   ry   r`   r|   r   r   r   r   r   )r%  rx   ry   r|   r   r   )rz   r   r   r`   r|   rg   r   ry   r{   r  r   rM   )CZbotocore.credentialsr  ImportErrorpopr   Zget_bedrock_model_idr,   rR   rh   Zget_credentialsZget_runtime_endpointr   rG   deepcopyrQ   r   r5   r^   rH   r   r   ZAmazonCohereConfigr   	enumerater   r   joinr   ZAmazonAnthropicClaudeConfigr   r   ZAmazonAnthropicConfigZAmazonAI21ConfigZAmazonMistralConfigZAmazonTitanConfigZAmazonLlamaConfigr4   re   Zpre_callr/   r   Zget_request_headersrx   r   async_streamingasync_completionr   rs   rr   r   Timeoutr   rv   r   r   readr   r   r+   r   rt   raise_for_statusr   r   r   r   r  )?rE   rz   r{   rw   r   r   r  r   r|   rg   r  r  r   r$  r  rv   r  r`   r   r   ZmodelIdr  r  r  r  r  r  r  r  r  r  r   Zlitellm_aws_region_nameZstandard_aws_region_namer"  r#  Zproxy_endpoint_urlr   r   Zinference_paramsr  configr<   rZ   _datary   Zsystem_messagesidxr   r  r  Ztool_calling_system_promptZopenai_configZfiltered_paramsrx   Zprepped_paramsr   r   r   streaming_responser   r   rM   )r!  r  rN   r     s  



































	


	




zBedrockLLM.completionc                    s   |d u r'i }|d urt |tst |trt|}||d< t|tjjd}n|}z|j	|||||	dI d H }|
  W n& tjyU } z|jj}t||jjdd }~w tjyb   tdddw | j|||t |
tro|
nd|	d|||||d	S )
Nr  )r   r   )rx   ry   r  r|   r   r   r   Fr   )rz   r   r   r`   r|   r   ry   r{   r  rg   r   )rR   rs   rr   r   r-  r   r   r   r   r   r/  r   r   r   r/   r   r   r  rq   )rE   rz   r{   rw   r   r  ry   r  r   r|   r`   rg   r   r$  rx   rv   r3  r   r   r   rM   rM   rN   r,    sL   
zBedrockLLM.async_completionru   r   c                    s<   t d tt|||||||	d|v rdnd|d
|d|	d}|S )Nr   TF)	rv   rw   rx   ry   rz   r{   r|   r}   r   r   )r   r   rz   r   r|   )r+   r   r   )rE   rz   r{   rw   r   r  ry   r  r   r|   r`   rg   r   r$  rx   rv   r   r4  rM   rM   rN   r+    s(   zBedrockLLM.async_streaming
model_pathc                 C   s<   |  d}t|dkr|d }|ttjv rttj|S dS )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)splitr   r	   r    BEDROCK_INVOKE_PROVIDERS_LITERALr   )r5  partsr   rM   rM   rN   _get_provider_from_model_path  s   
z(BedrockLLM._get_provider_from_model_path)rD   N)NNNN)$rk   rl   rm   rn   rO   rW   rh   rq   r   r   r   r   r   r   Responser'   r   rt   Unionro   r+   r  r   rs   r-  r   r   r   r,  r   rr   r+  r   r9  r;  __classcell__rM   rM   r   rN   r   u  s   
2
	


  3	


   


9
)r   c                  C   sH   t d u r"ddlm}  ddlm} |  }|dd}||}|da t S )Nr   )Loader)ServiceModelzbedrock-runtimez	service-2ZResponseStream)_response_stream_shape_cacheZbotocore.loadersr?  Zbotocore.modelr@  Zload_service_modelZ	shape_for)r?  r@  loaderZbedrock_service_dictZbedrock_service_modelrM   rM   rN   get_response_stream_shape  s   
rC  c                   @   s  e Zd Zd'dedee ddfddZdefdd	Zd
edee fddZ	dedee
eeef   fddZdefddZdedeee eee
eeef   f fddZdededeeee eee ee
eeef   f fddZdedee fddZdedefddZdedeeeef fddZd ee deeeeef  fd!d"Zd e e de eeeef  fd#d$Z!dee fd%d&Z"dS )(r   Frz   r~   rD   Nc                 C   s<   ddl m} || _| | _g | _d | _d | _|| _d | _d S )Nr   )EventStreamJSONParser)	Zbotocore.parsersrD  rz   parsercontent_blockstool_calls_indexresponse_idr~   _current_tool_name)rE   rz   r~   rD  rM   rM   rN   rO     s   
zAWSEventStreamDecoder.__init__c                 C   s`   d}t | jdkrdS d| jd vrdS | jD ]}d|v r%||d d 7 }qt |dkr.dS dS )zN
        Check if the tool call block so far has been an empty string
        r   r   FtoolUser   T)r   rF  )rE   argsblockrM   rM   rN   check_empty_tool_call_args  s   
z0AWSEventStreamDecoder.check_empty_tool_call_argsreasoning_content_blockc                 C   s   d|v r|d S d S )Nr   rM   )rE   rN  rM   rM   rN   extract_reasoning_content_str'  s   z3AWSEventStreamDecoder.extract_reasoning_content_strthinking_blockc                 C   s~   g }d}d|v rt dd}|d |d< n d|v r(t dd}|d |d< d|d< nd|v r4td|d d	}|dur=|| |S )
z;
        Translate the thinking blocks to a string
        Nr   Zthinking)r   	signaturer   ZredactedContentZredacted_thinking)r   ry   )r   r   r   )rE   rP  Zthinking_blocks_listZ_thinking_blockrM   rM   rN   translate_thinking_blocks.  s$   



z/AWSEventStreamDecoder.translate_thinking_blocks
chunk_datac                 C   sP   | j du r&d|v r|d d}|rd| | _ dS dS dt  | _ dS dS )z:Initialize response_id from chunk data if not already set.NZmessageStartZconversationIdz	chatcmpl-)rH  r   r   r   )rE   rS  Zconversation_idrM   rM   rN    _initialize_converse_response_idM  s   
z6AWSEventStreamDecoder._initialize_converse_response_id	start_objc                 C   s   d}i }d}g | _ |durgd|v rP|d durP|d d }t|d}|| _| jdu r3|tkr3|||fS | jdu r:dn| jd | _|d d d	|d
d| jd}nd|v rg|d durg| |d }d|d i}|||fS )z/Handle 'start' event in converse chunk parsing.NrJ  r   )response_tool_nameTr   r7  Z	toolUseIdr   r   r   r   r   r   r   reasoningContent)rF  r0   rI  r~   r   rG  rR  )rE   rU  tool_useprovider_specific_fieldsthinking_blocksZ_response_tool_namerV  rM   rM   rN   _handle_converse_start_eventX  s@   




z2AWSEventStreamDecoder._handle_converse_start_eventr	  r   c                 C   s   d}d}i }d}d}| j | d|v r|d }n]d|v rE| jdu r.| jtkr.|d d }nHddd|d d d| jdur@| jn|d	}n1d
|v rld
|d
 i}| |d
 }| |d
 }|rkt|dkrk|du rkd}n
d|v rvd|d i}|||||fS )z/Handle 'delta' event in converse chunk parsing.r   Nr   rJ  Tr   r   r   rW  rX  r   ZcitationsContent)	rF  r   r~   rI  r   rG  rO  rR  r   )rE   r	  r   r   rY  rZ  reasoning_contentr[  rM   rM   rN   _handle_converse_delta_event  s^   




z2AWSEventStreamDecoder._handle_converse_delta_eventc                 C   s\   d}| j du r| jtkrd| _|S d| _|  }|r,ddddd| jdur(| jn|d}|S )z>Handle stop/contentBlockIndex event in converse chunk parsing.NTr   z{}r   rW  )r~   rI  r   rM  rG  )rE   r   rY  Zis_emptyrM   rM   rN   _handle_converse_stop_event  s$   


z1AWSEventStreamDecoder._handle_converse_stop_eventc                 C   s  z|  | td| d}d }d}d }i }d }d }t|dd}	d|v r:tdi |d }
| |
\}}}n=d|v rStdi |d }| 	||	\}}}}}n$d|v r]| 
|	}nd|v rjt|dd}nd	|v rwt|d	i }i }d
|v r|d
}||d
< tt|dt|d|r|gnd |r|nd ||ddg| j| j||d}|W S  ty } z	tdt|d }~ww )Nz

Raw Chunk: {}

r   contentBlockIndexr   startr   
stopReasonra   r   traceZ	assistant)r   r   r   rZ  r[  r]  )r   r   r   )r   r   rz   r   rZ  zReceived streaming error - {}rM   )rT  r
   debugr   rr   r   ContentBlockStartEventr\  ContentBlockDeltaEventr^  r_  r   converse_configZ_transform_usager(   r)   r%   rH  rz   r   rh   )rE   rS  r   rY  r   r   rZ  r]  r[  Zcontent_block_indexrU  r	  Z'model_response_provider_specific_fieldsrc  r   r   rM   rM   rN   converse_chunk_parser
  s   


z+AWSEventStreamDecoder.converse_chunk_parserc                 C   s\  d}d}d}d|v r|d }nd| j v r&|dd dd}d	}d
}n~d|v s6d|v s6d|v s6d|v r<| j|dS d|v rL|di }| j|dS d|v r{t|d dkrl|d d dd d url|d d d }|dd }|d urzd	}|}n)d|v r|d }n d|v r|d }nd|v r|d }d	}n|dd rd	}|d }t|||d dd dS )Nr   Fr   r   r   r   ry   r   Tra   r`  rb  Zmetricsrc  rS  ZcontentBlockDeltar   r7  r   r   r   ZcompletionReason)r   is_finishedr   r   r   rY  )rz   r   rh  r   GChunk)rE   rS  r   rj  r   Z_chunk_datar   rM   rM   rN   _chunk_parserZ  sX   



z#AWSEventStreamDecoder._chunk_parseriteratorc                 c   s\    ddl m} | }|D ]}|| |D ]}| |}|r*t|}| j|dV  qqdS )zTGiven an iterator that yields lines, iterate over it & yield every event encounteredr   EventStreamBufferri  NZbotocore.eventstreamro  Zadd_data_parse_message_from_eventr   loadsrl  rE   rm  ro  Zevent_stream_bufferchunkeventr   r1  rM   rM   rN   r     s   


z AWSEventStreamDecoder.iter_bytesc                 C  sf   ddl m} | }|2 z#3 dH W }|| |D ]}| |}|r.t|}| j|dV  qq6 dS )zZGiven an async iterator that yields lines, iterate over it & yield every event encounteredr   rn  Nri  rp  rs  rM   rM   rN   r     s   


z!AWSEventStreamDecoder.aiter_bytesc                 C   s   |  }| j|t }|d dkrN|d  }t|tr#|d}n
t|tr+|}nd}|d d}|d | }t	|d t|trJt
|d	|d	d
|v rb|d
}|s[d S |d S |d}|skd S | S )Nr   r   bodyr   r   rx   z:exception-type r   rt  bytes)Zto_response_dictrE  parserC  decoderR   rt   r   rh   r/   r   r   )rE   ru  Zresponse_dictZparsed_responseZdecoded_bodyerror_messageZexception_statusrt  rM   rM   rN   rq    s6   




z/AWSEventStreamDecoder._parse_message_from_eventF)#rk   rl   rm   rh   r   rq   rO   rM  Z)BedrockConverseReasoningContentBlockDeltarO  ro   r=  r   r   rR  rt   rT  re  r   r    r\  rf  rr   r^  r_  r(   rh  rk  rl  r   rx  r   r   r   rq  rM   rM   rM   rN   r     s    



?

R
!P
<

r   c                	       sH   e Zd Z	ddededee ddf fddZdedefd	d
Z	  Z
S )r   Nrz   r   r~   rD   c                    s"   t  j|d td||d| _dS )z
        Child class of AWSEventStreamDecoder that handles the streaming response from the Anthropic family of models

        The only difference between AWSEventStreamDecoder and AmazonAnthropicClaudeStreamDecoder is the `chunk_parser` method
        r   N)r4  r   r~   )r   rO   AnthropicModelResponseIterator!anthropic_model_response_iterator)rE   rz   r   r~   r   rM   rN   rO     s   z+AmazonAnthropicClaudeStreamDecoder.__init__rS  c                 C      | j j|dS N)rt  )r~  chunk_parserrE   rS  rM   rM   rN   rl    r   z0AmazonAnthropicClaudeStreamDecoder._chunk_parserr   )rk   rl   rm   rh   rq   r   rO   rt   r(   rl  r>  rM   rM   r   rN   r     s    r   c                       sF   e Zd Zdededdf fddZdedeee	ef fdd	Z
  ZS )
r   rz   r   rD   Nc                    s,   t  j|d ddlm} |d |d| _d S )Nr   r   ) AmazonDeepseekR1ResponseIterator)r4  r   )r   rO   ZOlitellm.llms.bedrock.chat.invoke_transformations.amazon_deepseek_transformationr   deepseek_model_response_iterator)rE   rz   r   r  r   rM   rN   rO     s   z&AmazonDeepSeekR1StreamDecoder.__init__rS  c                 C   r  r  )r  r  r  rM   rM   rN   rl    s   z+AmazonDeepSeekR1StreamDecoder._chunk_parser)rk   rl   rm   rh   rq   rO   rt   r=  rk  r(   rl  r>  rM   rM   r   rN   r     s    r   c                	   @   s|   e Zd Zddee fddZdd Zdedeee	  d	e
eee	 f fd
dZded	efddZdd Zdd Zdd ZdS )r   Fr~   c                 C   s   || _ || _d| _d S )NF)r   r~   is_done)rE   r   r~   rM   rM   rN   rO     s   
zMockResponseIterator.__init__c                 C      | S r   rM   rd   rM   rM   rN   __iter__     zMockResponseIterator.__iter__r   r   rD   c                 C   sh   d}| j du r"|dur"t j|d}|dur|jpd}d}||fS |dur0t|dkr0|d }||fS )a+  
        If JSON mode is enabled, convert the tool call to a message.

        Bedrock returns the JSON schema as part of the tool call
        OpenAI returns the JSON schema as part of the content, this handles placing it in the content

        Args:
            text: str
            tool_use: Optional[ChatCompletionToolCallChunk]
        Returns:
            Tuple[str, Optional[ChatCompletionToolCallChunk]]

            text: The text to use in the content
            tool_use: The ChatCompletionToolCallChunk to use in the chunk response
        NT)r   r   r   )r~   r   ZAnthropicConfigZ!_convert_tool_response_to_messager   r   )rE   r   r   rY  r   rM   rM   rN   _handle_json_mode_chunk  s   
z,MockResponseIterator._handle_json_mode_chunkrS  c              
   C   s
  znt |d}|jd jjpd}d }tttt  tt|jd jj	}| j
du r6| j||jd jj	d\}}n|d urQt|d jdt|d jj|d jjddd}t||dt|jd jp]dd	t|j|j|jd
dd}|W S  ty } z
td| d| d }~ww )Nr   r   r   T)r   r   r   r   rW  )r   r   )r   rY  rj  r   r   r   zFailed to decode chunk: z	. Error: )r   r   r   r   r   r   ro   r#   r$   r   r~   r  r    r   r!   r   r   r   rk  r   r   r"   r   r   r   r   
ValueError)rE   rS  Zchunk_usager   rY  Z_model_response_tool_callZprocessed_chunkr   rM   rM   rN   rl  -  sT   




	z"MockResponseIterator._chunk_parserc                 C   s   | j rtd| _ | | jS NT)r  StopIterationrl  r   rd   rM   rM   rN   __next__W  s   zMockResponseIterator.__next__c                 C   r  r   rM   rd   rM   rM   rN   	__aiter__^  r  zMockResponseIterator.__aiter__c                    s   | j rtd| _ | | jS r  )r  StopAsyncIterationrl  r   rd   rM   rM   rN   	__anext__a  s
   zMockResponseIterator.__anext__Nr|  )rk   rl   rm   r   rq   rO   r  rh   ro   r    r   r  r'   rk  rl  r  r  r  rM   rM   rM   rN   r     s    

*r   )FFNru   )^rn   rG   r  rS   	functoolsr   typingr   r   r   r   r   r   r	   r   r   r
   Zlitellm._uuidr   Zlitellm.caching.cachingr   Zlitellm.constantsr   Z'litellm.litellm_core_utils.core_helpersr   Z*litellm.litellm_core_utils.litellm_loggingr   Z(litellm.litellm_core_utils.logging_utilsr   Z3litellm.litellm_core_utils.prompt_templates.factoryr   r   r   r   r   r   r   Z#litellm.llms.anthropic.chat.handlerr   r}  Z&litellm.llms.custom_httpx.http_handlerr   r   r   r   Zlitellm.types.llms.bedrockZlitellm.types.llms.openair   r   r    r!   r"   Zlitellm.types.utilsr#   r$   r%   r&   rk  r'   r(   r)   r*   Zlitellm.utilsr+   r,   Zbase_aws_llmr.   Zcommon_utilsr/   r0   rA  r2   rp   Z1litellm.llms.bedrock.chat.converse_transformationr3   ZMlitellm.llms.bedrock.chat.invoke_transformations.amazon_openai_transformationr4   rg  r5   rh   rt   r   rq   r9  rr   r   rx  r   r   rC  r   r   r   r   rM   rM   rM   rN   <module>   s    $
$	m	

g	

^       	   V