
    h                       U d Z ddlZddlZddl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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!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l0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z: ddl7m;Z< ddl7m=Z=m>Z>m?Z?m@Z@ ddlAmBZBmCZC ddlDmEZE ddlFmGZGm)Z)mHZH daI edd      ZJeeKd<   ddlLmMZM  eM       ZN G d d      ZO	 	 	 d5dee,   dePdeQd ePd!ePd"eRd#ed$eSd%eeS   d&eej                     fd'ZU	 	 	 d5dee-   dePdeQd ePd(eeV   d!ePd"eRd#ed$eSd%eeS   d&eej                     fd)ZW G d* d+eE      ZXd, ZY G d- d.      ZZ G d/ d0eZ      Z[ G d1 d2eZ      Z\ G d3 d4      Z]y)6z
TODO: DELETE FILE. Bedrock LLM is no longer used. Goto `litellm/llms/bedrock/chat/invoke_transformations/base_invoke_transformation.py`
    N)partial)
AnyAsyncIteratorCallableIteratorListOptionalTupleUnioncastget_args)verbose_logger)InMemoryCache)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  )max_size_in_memorydefault_ttlbedrock_tool_name_mappings)AmazonConverseConfigc                   (   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Zed        Zdee   fdZdededefdZy)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                     t               j                         }|j                         D ]%  \  }}|dk7  s|t        | j                  ||       ' y )Nself)localscopyitemssetattr	__class__)rJ   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   locals_keyvalues                     d/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/bedrock/chat/invoke_handler.py__init__zAmazonCohereChatConfig.__init__e   sA    " (--/!--/JCf}!2U3 *    c                     | j                   j                         D ci c]O  \  }}|j                  d      s9t        |t        j
                  t        j                  t        t        f      s|||Q c}}S c c}}w )N__)	__dict__rM   
startswith
isinstancetypesFunctionTypeBuiltinFunctionTypeclassmethodstaticmethod)clsr@   vs      rS   
get_configz!AmazonCohereChatConfig.get_config{   st     **,
1<<%&&-- 	  qD
 	
 
s   AA6c                 
    g dS )N)r=   max_completion_tokensstreamstopr>   top_prB   rC   rD   rf   toolstool_choice rJ   s    rS   get_supported_openai_paramsz2AmazonCohereChatConfig.get_supported_openai_params   s    
 	
rU   non_default_paramsoptional_paramsc                     |j                         D ]i  \  }}|dk(  s|dk(  r||d<   |dk(  r||d<   |dk(  rt        |t              r|g}||d<   |dk(  r||d<   |dk(  r||d<   |d	k(  r||d	<   |d
k(  r||d
<   	 ||d<   k |S )Nr=   rd   re   rf   rF   r>   rg   r?   rB   rC   rD   )rM   rZ   str)rJ   rm   rn   paramrR   s        rS   map_openai_paramsz(AmazonCohereChatConfig.map_openai_params   s     /446LE5$1H(H05- ,1)eS)"GE49 01%16.',$++7< 34**6; 23*/'% 7& rU   )NNNNNNNNNNNNNN) __name__
__module____qualname____doc__r:   r	   r   Document__annotations__r;   boolr<   rp   r=   intr>   floatr?   r@   rA   rB   rC   rD   rE   rF   rG   rT   r^   rb   rl   dictrr   rj   rU   rS   r9   r9   Q   s    +/IxX'.*.$."Hhsm" $J$#'K%'AxAx'+x}+)-x-(,huo,D(3-$(M8D>(*.NHT#Y'.$(M8D>( /3.2"&$('+!!+/-1,0"(,(,(,4DN+4 &d^4 3-	4
 SM4 e_4 E?4 E?4 $C=4 $E?4 #5/4 sm4  ~4 !4  ~4  
!4, 
 
"
T#Y 
 "&9=	rU   r9   clientapi_baseheadersdatamodelmessageslogging_objfake_stream	json_modebedrock_invoke_providerc
                 :  K   	 | $t        t        j                  j                        } | j	                  |||| |       d {   }
|
j
                  dk7  r!t        |
j
                  |
j                        |r[t        j                         j                  ||
t        j                         d|i d||t        j                  
      }t        ||      }n|	d	k(  r0t        |d
|      }|j                  |
j                  d            }na|	dk(  r/t        |d
      }|j                  |
j                  d            }n-t!        |      }|j                  |
j                  d            }|j#                  |ddd|i       |S 7 A# t$        j&                  $ r<}|j(                  j
                  }t        ||j(                  j                        d }~wt$        j*                  $ r t        dd      t,        $ r}t        dt/        |            d }~ww xY ww)N)llm_providerr   r   re   r      status_codemessageT 
r   responsemodel_responsere   r   rn   api_keyr   r   encodingr   r   	anthropicFr   sync_streamr      
chunk_sizedeepseek_r1r   r   r   first stream response receivedcomplete_input_dictinputr   original_responseadditional_args  Timeout error occurred.  )r   litellmLlmProvidersBEDROCKpostr   r1   textr7   _transform_responser)   r   MockResponseIterator"AmazonAnthropicClaudeStreamDecoderaiter_bytesAmazonDeepSeekR1StreamDecoderAWSEventStreamDecoder	post_callhttpxHTTPStatusErrorr   TimeoutException	Exceptionrp   )r}   r~   r   r   r   r   r   r   r   r   r   r   completion_streamdecodererr
error_codees                    rS   	make_callr      s9    I<>+$1199F  "?# % 
 
 3&8+?+?WW ,,.BB!&446' "! )) C   &:-& %3-O!#.G
 !( 3 3$$$5! %53!G !( 3 3$$$5! ,%8G ' 3 3$$$5!
 	>2D9	 	 	
 ! y
z    N\\--
z3<<;L;LMM!! Os4MNN <sCF;;<sH   HA F FD?F HF H7G+H=HHHsigned_json_bodyc                    	 | t        i       } | j                  ||||n|| |      }|j                  dk7  r!t        |j                  |j                        |r[t        j                         j                  ||t        j                         d|i d||t
        j                  
      }t        ||	      }n|
d	k(  r0t        |d|	
      }|j                  |j                  d            }na|
dk(  r/t        |d      }|j                  |j                  d            }n-t        |      }|j                  |j                  d            }|j                  |ddd|i       |S # t         j"                  $ r<}|j$                  j                  }t        ||j$                  j                        d }~wt         j&                  $ r t        dd      t(        $ r}t        dt+        |            d }~ww xY w)N)paramsr   r   r   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r1   r   r   r7   r   r)   r   r   r   
iter_bytesr   r   r   r   r   r   r   r   rp   )r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                     rS   make_sync_callr     s   A<>&b1F;;%5%A!t"?#  
 3&8+?+?WW ,,.BB!&446' "! )) C   &:-& %3-O #.G
 !( 2 283F3FRV3F3W X$53 G !( 2 283F3FRV3F3W X+%8G ' 2 283F3FRV3F3W X 	>2D9	 	 	
 !    N\\--
z3<<;L;LMM!! Os4MNN <sCF;;<s$   E$E' 'G7:7F11+G7G22G7c                       e Zd ZdZd! fdZdeeee   f   f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Zdedef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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Z e       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fd       Zededeej@                     fd       Z!dedeej@                     dedefdZ"dedefd Z# x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
        }'
    ```
    rH   Nc                 "    t         |           y N)superrT   )rJ   rO   s    rS   rT   zBedrockLLM.__init__r  s    rU   c                    d}d }||v r;||   }t        |d   |j                  dd      |j                  dd      |      }|d fS |dk(  s|dk(  rt        ||d	      }||fS |d
k(  rt        ||d	      }||fS |dk(  s|dk(  rt        ||d	      }||fS |dk(  rt        |      \  }}||fS d}|D ]+  }d|v r|d   dk(  r
||d    z  }||d    z  }#||d    z  }- ||fS )Nr   rolesinitial_prompt_valuefinal_prompt_value)	role_dictr   r   r   r   amazonbedrockr   r   custom_llm_providermistralmetallamacoherer   roleusercontent)r   getr   r   )	rJ   r   r   providercustom_prompt_dictpromptchat_historymodel_prompt_detailsr   s	            rS   convert_messages_to_promptz%BedrockLLM.convert_messages_to_promptu  s|    '+&&#5e#< ".w7%9%=%=*B& $8#;#;<PRT#U!F 4<{"h(&:#hIF. |##) "#hIF& |##! 8w#6#hIF |## !#4h#G FL |## F#W$v&0WY%7$89WY%7$89!3 45F $ |##rU   r   r   r   re   r   rn   r   r   r   c           	         | j                  |      }|j                  |	||j                  d|i        |
d|j                          	 |j                         }d }	 |dk(  rCd|v r|d   }nd|v r|d   d	   d   }t        |d   d	   d
         |j                  d	   _        ns|dk(  r|j                  d      ri }d}d|v r*d}|d   D ]   }|d   j                  dd       ||d   d   <   " |j                  d      d	   j                  dd       }|t        d|      rt        d|      d	   }t        d|      d	   j                         }d| d}t        ||j                  |d             }t        j                   dt#        j$                          d|t        j&                  |      ddgd       }||j                  d	   _        ||j*                  d<   |du r||du r |
d       t-        d      }t/        |j                  d	   d
d       |j                  d	   _        t        j0                  j3                         }|j                  d	   j4                  |_        g } |
d!t7        |j                  d	                  |
d"t7        |              t9        |j                  d	   t        j:                        r2t/        |j                  d	   j(                  d#d       	 t9        |j                  d	   j(                  j<                  t>              rO|j                  d	   j(                  j<                  D ])  }i |jA                         d$d	i}|jC                  |       + tE        t/        |j                  d	   j(                  dd       |j                  d	   j(                  jF                  |%      }||_$        |g|_        tK        |&      } |
d'       t        jL                  ||d(|)      S t        |j                  d*d+            |j                  d	   _        t        jN                  |d,   d-   |d,   d.   |d,   d-   |d,   d.   z   /      }tQ        |d,|       n|d0   }|d*   |j                  d	   _        n|d1k(  r3|j                  d2      d	   j                  d3      j                  d      }na|d4k(  s|d5k(  r|d6   }nQ|d7k(  r)|d8   d	   d   }|d8   d	   d*   |j                  d	   _        n#|j                  d9      d	   j                  d:      }	 |ktW        |      d	kD  r]tY        |j                  d	   d<      rDt/        |j                  d	   j(                  d#d       	 ||j                  d	   j(                  _-        nItY        |j                  d	   d<      r&t/        |j                  d	   j(                  d#d       	 n
t	               |r|d1k(  rt-        d      }|j                  d	   j                  |j                  d	   _        t        j0                  j3                         }|j                  d	   j4                  |_        t        j0                  jE                  t/        |j                  d	   j(                  dd       |j                  d	   j(                  jF                  >      }||_$        |g|_        tK        |&      }tM        ||d(|)      S |j^                  j                  d?d       } |j^                  j                  d@d       }!ta        | xs t        jb                  |	A            }"ta        |!xs8 t        jb                  |j                  d	   j(                  jZ                  dB            }#ta        te        jd                               |_3        ||_4        tO        |"|#|"|#z   /      }$tQ        |d,|$       |S # t        $ r t        |j                  d      w xY w# t        $ r5}t        d;jS                  |j                  tU        |            d      d }~ww xY w# t        $ r5}t        d=jS                  |tU        |            |j\                        d }~ww xY w)CNr   r   zraw model_response: i  )r   r   r   r   generationsr   finish_reasonr   anthropic.claude-3Frh   Tfunction
parametersnamer   invoke	tool_namez<invoke>z	</invoke>)json_schemacall_r   	arguments)idtyper   )
tool_callsr   r   z5INSIDE BEDROCK STREAMING TOOL CALLING CONDITION BLOCK)re   rf   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   r   r   r   stop_reasonr   usageinput_tokensoutput_tokensprompt_tokenscompletion_tokenstotal_tokens
completionai21completionsr   r   r   
generationr   outputsresults
outputTextz&Error processing={}, Received error={}r   z(Error parsing received text={}.
Error-{})r   r   z x-amzn-bedrock-input-token-countz!x-amzn-bedrock-output-token-countr   )r   count_response_tokens)5get_bedrock_invoke_providerr   r   jsonr   r1   r   choicesr   rY   r   r   r   stripr   r   Messageuuiduuid4dumpsr   _hidden_paramsr)   getattrutilsr+   r   r   rZ   r&   r   listr|   appendr'   r   deltar   r-   r,   rN   formatrp   lenhasattrr   r   r   rz   token_countertimecreatedr   )%rJ   r   r   r   re   r   rn   r   r   r   print_verboser   r   completion_responser   json_schemas_is_function_calltoolfunction_namefunction_arguments_strfunction_arguments_messagestreaming_model_responsestreaming_choice_tool_calls	tool_call
_tool_call	delta_objr   _usager   mribedrock_input_tokensbedrock_output_tokensr   r   r   s%                                        rS   process_responsezBedrockLLM.process_response  s	    33E:&mm2D9	 	 	
 	,X]]O<=	G"*--/ %)
Q	8#00!4V!<J"&99!4]!CA!Fv!NJ>O+M:1=oN?N**1-; [(##$89)+L(-%/1,0)$3G$<DEI *F!c,5 )j)9&)AB %= "5!8!8!CA!F!J!J6SW!XJ!-, *3 )=[*(UVW(X1E$j22"UW / ''=&>iH / .>2(4(8(8 -t).* $+?? -2$**,*@,60=59ZZ@R5S1&!"	( %)$ =E..q19 ' '55/ *T1"."dN%S 4A3M0LS*2215M088;I ,3==+I+I+K(1?1G1G1J1P1P(.&(%A$~G]G]^_G`BaAbc &8>N9O8PQ &n&<&<Q&?Q& . 6 6q 9 A A<QU %) *.8 . 6 6q 9 A A L Ld/ 2@1G1G$%2"")'**25I 2RINN4D1Qgq1QJ$/$6$6z$B	25
 ).(/$2$:$:1$=$E$EyRV)" &4%;%;A%>%F%F%K%K+6)I 6?,2@P?Q4<0E/G1- * o $+#>#>2C&+4E,7	$  ?P+//rB?N**1-; %]]&9'&B>&R*=g*F*W%8%A.%Q-g6G&HF NGV<!4\!BJ>Q%?N**1-; V#'++M:1=AA&IMMfU  V#x7':0>
Y&0;A>vF
:M;;";$&&q)7 144Y?BFF|T
	&
Oa'N2215yAN2215==|TR =G&&q)119..q19=N2215==|TR k! h&('4D'A$@N@V@VAm %,,Q/=  '}}==?%3%;%;A%>%D%D"++ 6 6q 9 A A9dS#++A.66;; , I &/"0@/A$,'7OPC&"%$5'	   (//33. 
 !) 0 0 4 4/!
  LG$9$98$L
  ! $$#++A.66>>&*
 "%TYY[!1$'/&)::

 	/G  	Gx}}#FF	G^  	@GGMM3q6  	 	2  	CJJA %00	 	sE   	_ N_% 3D$_% B6`& !_"%	`#.0``#&	a$/0aa$model_idc                 D    t         j                  j                  |d      S )z
        Double encode the model ID to ensure it matches the expected double-encoded format.
        Args:
            model_id (str): The model ID to encode.
        Returns:
            str: The double-encoded model ID.
        r   )safe)urllibparsequote)rJ   r*  s     rS   encode_model_idzBedrockLLM.encode_model_id  s     ||!!(!44rU   r~   r   r  acompletiontimeoutextra_headersr}   c                 x   	 ddl m} ddlm} ddlm} |	j                  dd       }| j                  |      }| j                  |||	      }|	j                  dd       }|	j                  d	d       }|	j                  d
d       }|	j                  dd       }|	j                  dd       }|	j                  dd       }|	j                  dd       }|	j                  dd       }|	j                  dd       }|	j                  dd       }|Dt        dd       } | t        | t              r| }t        dd       }!|!t        |!t              r|!}|d}| j                  |||||||||	      }"| j                  |||      \  }#}$||du r|dk7  r|# d| d}#|$ d| d}$n|# d| d}#|$ d| d}$ ||"d|      }%| j                  ||||      \  }&}'t!        j"                  |	      }(i })|dk(  r|j%                  d      rht'        j(                         j+                         }*|*j-                         D ]  \  }+},|+|(vs|,|(|+<    d|&i|(}-|'|'|-d <   t/        j0                  |-      }.nt&        j2                  j+                         }*|*j-                         D ]  \  }+},|+|(vs|,|(|+<    |du rd|(d<   t/        j0                  d!|&i|(      }.n|d"k(  r|j%                  d#      rXg }/g }0t5        |      D ]3  \  }1}2|2d$   d%k(  s|0j7                  |2d&          |/j7                  |1       5 t9        |/      dkD  r6d'j;                  |0      |(d%<   t5        |      D 34cg c]  \  }3}4|3|/vs|4 }}3}4t=        ||d()      }t&        j>                  j+                         }*|*j-                         D ]  \  }+},|+|(vs|,|(|+<    d*|(v rbd}5|(d*   D ]   }6|6d+   jA                  d,d       |)|6d+   d-   <   " tC        |(d*   .      }7|(jA                  d%d'      |7z   |(d%<   |(j                  d*       t/        j0                  d/|i|(      }.nt&        jD                  j+                         }*|*j-                         D ]  \  }+},|+|(vs|,|(|+<    t/        j0                  d!|&i|(      }.n|dk(  r[t&        jF                  j+                         }*|*j-                         D ]  \  }+},|+|(vs|,|(|+<    t/        j0                  d!|&i|(      }.nT|d0k(  rZt&        jH                  j+                         }*|*j-                         D ]  \  }+},|+|(vs|,|(|+<    t/        j0                  d!|&i|(      }.n|d1k(  rYt&        jJ                  j+                         }*|*j-                         D ]  \  }+},|+|(vs|,|(|+<    t/        j0                  |&|(d2      }.n|d3k(  s|d4k(  rZt&        jL                  j+                         }*|*j-                         D ]  \  }+},|+|(vs|,|(|+<    t/        j0                  d!|&i|(      }.n3|jO                  |d5d6|(i7       tQ        d8d9jS                  ||      :      d;d<i}8|d;d<i|}8 |d=|#|.|8>      }9|%jU                  |9       |d?|v r|d?   |9jV                  d?<   |9jY                         }:|jO                  |d5|.|$|:jV                  d@7       |
rot        |tZ              rd }|du r/|dk7  r*| j]                  |||.|$|||||	d|||:jV                  ||A      S | j_                  |||.|$|||||	||||:jV                  ||A      S |t        |t`              rOi };|:t        |tb              st        |td              rtg        jh                  |      }||;dB<   tk        |;      | _6        n|| _6        ||du r|dk7  r| jl                  jo                  |$|:jV                  |.||C      }<|<jp                  dDk7  r.tQ        |<jp                  t        |<js                               :      tu        |E      }=|=jw                  |<jw                  dFG            }>ty        |>|d|H      }?|j{                  |d5|?d6|.iI       |?S 	 | jl                  jo                  |$t}        |:jV                        |.|J      }<|<j                          | j                  ||<||||	d5|.|||M      S # t        $ r t        d      w xY wc c}4}3w # tf        j                  $ r<}@@j                  jp                  }AtQ        |A|@j                  j                  :      d }@~@wtf        j                  $ r tQ        dKdL:      w xY w)NNr   )	SigV4Auth)
AWSRequest)Credentialsz7Missing boto3 to call bedrock. Run 'pip install boto3'.re   )r   r   rn   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_endpointAWS_REGION_NAME
AWS_REGIONz	us-west-2)	r9  r8  r:  r;  r=  r>  r<  r@  rA  )r~   r?  r;  Tr   z/model/z/invoke-with-response-streamz/invoker   r   zcohere.command-rr   r   r   r   r   r   systemr   
anthropic_xmlr   rh   r   r   r   )rh   r   r   r   )	inputTexttextGenerationConfigr   r   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POST)methodurlr   r   Authorization)r   r~   r   )r   r   r   r~   r   r  r   r   rn   re   litellm_params	logger_fnr   r2  r}   r2  )rK  r   r   re   r   r   r   r   r   r   r   )rK  r   r   r   r   r   )r   r   r   re   r   rn   r   r   r   r  r   )Ebotocore.authr5  botocore.awsrequestr6  botocore.credentialsr7  ImportErrorpopr  get_bedrock_model_idr.   rZ   rp   get_credentialsget_runtime_endpointr   rL   deepcopyrY   r   r9   rb   rM   r  r	  AmazonCohereConfig	enumerater  r  joinr   AmazonAnthropicClaude3Configr   r   AmazonAnthropicConfigAmazonAI21ConfigAmazonMistralConfigAmazonTitanConfigAmazonLlamaConfigpre_callr1   r  add_authr   preparer   async_streamingasync_completionr   r{   rz   r   Timeoutr   r}   r   r   readr   r   r-   r   r|   raise_for_statusr   r   r   r   r)  )BrJ   r   r   r~   r   r   r  r   r   rn   r1  r2  rM  rN  r3  r}   r5  r6  r7  re   r   modelIdr8  r9  r:  r;  r<  r=  r>  r?  r@  rA  litellm_aws_region_namestandard_aws_region_namecredentialsendpoint_urlproxy_endpoint_urlsigv4r   r   inference_paramsr  configr@   ra   _datar   system_prompt_idxsystem_messagesidxr   jir  r  tool_calling_system_promptr   requestprepped_paramsr   r   r   streaming_responser   r   sB                                                                     rS   r   zBedrockLLM.completion  s
   $	Y/68
 !$$Xt433E:+++ , 
 !0 3 34KT R+//0CTJ+//0CTJ)--.?F'++OTB*../A4H*../A4H'6':':*D(
$ "1!4!45Mt!T*../A4H "&01BD&I#&2z'8 #:'1,'E$'3
(#9 #;&"-#'#7#7/"7/+--'#9- $8 
$
 ,0+D+D)E+ ,E ,
(( 6T>x67I*^77);WXL%&ggY6RS  +^77)7CL$6#7wwiw!O+y/B#>>8X'9 
  ==9x 23 779DDF"LLNDAq!11./(+	 +
 #F?.>?+,8E.)zz%( !33>>@"LLNDAq!11./(+	 +
 T>  %  zz8V"H7G"HI$ 45/1!-/$-h$7LCv(2'..wy/AB)005 %8 ()A-15?1K$X.&/&9 "aQFW=W H   *( !==HHJ"LLNDAq!11./(+	 + ..(,% 0 9AEjAQAUAU($BT*%5f%=> !: 2R.w72. ),,Xt<45 %X. %((1zz:x"L;K"LM !66AAC"LLNDAq!11./(+	 +
 zz8V"H7G"HI--88:F1--*+$Q'	 ' ::xD3CDED"00;;=F1--*+$Q'	 ' ::xD3CDED!..99;F1--*+$Q'	 ' ::!',<D 8w#6..99;F1--*+$Q'	 '
 ::xD3CDED   )+;! !   L  S  Se  "#56$%'9K]KG|$
 	w%/]*J/<_/MGOOO,//# 	'+."?? 	 	
 &+.~(f"4++%/#1"/% +$3#1'#OO#! ,  $ ((!+-+!' /-# )  $ >Z0@AG"gu-GS1I#mmG4G%,	"+G4DK DK6T>x67I{{''&' ( H ##s*" ( 4 4c(--/>R  ,%8G ' 2 283F3FRV3F3W X!4"3$-'	" !!"4!6 =	 "  &%	S{{''&W__-'	 ( H %%' $$)#+' % 
 	
k
  	YWXX	Yn p $$ 	R11J:s||?P?PQQ%% 	S38QRR	Ss0   b- 	ccAc -cd97d$d9c                 z  K   |di }|:t        |t              st        |t              rt        j                  |      }||d<   t        |t        j                  j                        }n|}	 |j                  |||||	       d {   }|j                          | j#                  |||t        |
t$              r|
nd|	d|||||	      S 7 B# t        j                  $ r<}|j                  j                  }t        ||j                  j                        d }~wt        j                   $ r t        dd      w xY ww)
Nr2  )r   r   )r   r   r2  r   r   r   r   Fr   )r   r   r   re   r   r   r   r   r  rn   r   )rZ   r{   rz   r   rf  r   r   r   r   r   rh  r   r   r   r1   r   r   r)  ry   )rJ   r   r   r~   r   r  r   r2  r   r   re   rn   rM  rN  r   r}   r{  r   r   r   s                       rS   re  zBedrockLLM.async_completion&  sB    $ >G"gu-GS1I#mmG4G%,	"+7I]I]IeIefFF	S#[[' )  H %%' $$)'565#'+ % 
 	
 $$ 	R11J:s||?P?PQQ%% 	S38QRR	Ss<   A)D;,C
 CC
 .D;C
 
D87D$D88D;c                 f   K   t        d t        t        |||||||	d|v rdnd	      |d|	      }|S w)Nr   TF)r}   r~   r   r   r   r   r   r   r   )r   r   r   r   r   )r-   r   r   )rJ   r   r   r~   r   r  r   r2  r   r   re   rn   rM  rN  r   r}   r|  s                    rS   rd  zBedrockLLM.async_streaming_  sU     * 1"!!'$*h$6DE
  )#
" "!s   /1
model_pathc                     | j                  d      }t        |      dk\  r:|d   }|t        t        j                        v rt        t        j                  |      S y)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   )r  partsr   s      rS   _get_provider_from_model_pathz(BedrockLLM._get_provider_from_model_path  sQ       %u:?QxH8G$L$LMMGDDhOOrU   r   c                     |j                  dd       }|| j                  |      }n|}|dk(  rd|v r| j                  |      }|S )Nr*  r*  r   llama/)rS  r0  "_get_model_id_for_llama_like_model)rJ   rn   r   r   ri  s        rS   rT  zBedrockLLM.get_bedrock_model_id  sX     "%%j$7**G*<GGw8w#6==gFGrU   c                 J    |j                  dd      }| j                  |      S )zp
        Remove `llama` from modelID since `llama` is simply a spec to follow for custom bedrock models
        r  r   r  )replacer0  )rJ   r   r*  s      rS   r  z-BedrockLLM._get_model_id_for_llama_like_model  s(     ==2.##X#66rU   )rH   N)NNNN)%rs   rt   ru   rv   rT   r
   rp   r	   r  r   r   Responser)   ry   r   r|   r   r   r-   r)  r0  r   r{   rf  r   r   r   re  r   rd  r_   r   r  r  rT  r  __classcell__rO   s   @rS   r   r   _  sn   $,$	sHTN"	#,$\~~ ..~ &	~
 ~ ~ ~ ~ D#I~ ~ 
}11	2~@5 5 5. (,AE!w
w
 w
 3-	w

 !w
 &w
  w
 w
 w
 w
 %u}} 456w
  ~w
  /<=>!w
" 
}11	2#w
L -1!7
7
 7
 	7

 &7
  7
 7
 %u}} 4567
 7
 7
  )*!7
" 
}11	2#7
r  -1!%"%" %" 	%"
 &%"  %" %" %u}} 456%" %" %"  )*!%"" 
#%" %"N 	'::	; & 7CCD 	
 
"77 
7rU   r   c                      t         >ddlm}  ddlm}  |        }|j                  dd      } ||      }|j                  d      a t         S )Nr   )Loader)ServiceModelzbedrock-runtimez	service-2ResponseStream)_response_stream_shape_cachebotocore.loadersr  botocore.modelr  load_service_model	shape_for)r  r  loaderbedrock_service_dictbedrock_service_models        rS   get_response_stream_shaper    sM    #++/%889JKX ,-A B'<'F'FGW'X$''rU   c                       e Zd ZdeddfdZdefdZdedee   fdZ	dedee
eeef         fd	Zd
edefdZd
edeeeef   fdZdee   deeeeef      fdZdee   deeeeef      fdZdee   fdZy)r   r   rH   Nc                 R    ddl m} || _         |       | _        g | _        d | _        y )Nr   )EventStreamJSONParser)botocore.parsersr  r   parsercontent_blockstool_calls_index)rJ   r   r  s      rS   rT   zAWSEventStreamDecoder.__init__  s&    :
+-<>/3rU   c                     d}t        | j                        dk(  ryd| j                  d   vry| j                  D ]  }d|v s||d   d   z  } t        |      dk(  ryy)zN
        Check if the tool call block so far has been an empty string
        r   r   FtoolUser   T)r  r  )rJ   argsblocks      rS   check_empty_tool_call_argsz0AWSEventStreamDecoder.check_empty_tool_call_args  sv     t""#q( T0033((EE!i(11 ) t9>rU   reasoning_content_blockc                     d|v r|d   S y )Nr   rj   )rJ   r  s     rS   extract_reasoning_content_strz3AWSEventStreamDecoder.extract_reasoning_content_str  s     ,,*622rU   thinking_blockc                     g }d}d|v rt        d      }|d   |d<   n2d|v rt        d      }|d   |d<   d|d<   nd|v rt        d|d   	      }||j                  |       |S )
z;
        Translate the thinking blocks to a string
        Nr   thinking)r   	signaturer   redactedContentredacted_thinking)r   r   )r!   r    r  )rJ   r  thinking_blocks_list_thinking_blocks       rS   translate_thinking_blocksz/AWSEventStreamDecoder.translate_thinking_blocks  s      	
  	 ^#9zJO*8*@OJ'N*9zJO+9++FOK(*,OJ'.0A(~>O/PO & ''8##rU   
chunk_datac                    	 t        j                  dj                  |             d}d }d}d }i }d }d }t        |j	                  dd            }	d|v rt        di |d   }
g | _        |
d|
v rW|
d   R|
d   d   }t        |      }| j                  dn| j                  d	z   | _        |
d   d
   d|dd| j                  d}nAd|
v r<|
d   6| j                  |
d         }d|
d   i}nd|v rt        di |d   }| j                  j                  |       d|v r|d   }nd|v r)d dd |d   d   d| j                  | j                  n|	d}nd|v rd|d   i}| j                  |d         }| j                  |d         }|rt        |      dkD  rr|pd}nmd|v r | j                         }|rWd dd dd|d   d}nId|v rt        |j	                  dd            }n)d|v r%t         j#                  |j	                  di             }i }d|v r|j	                  d      }||d<   t%        t'        ||	t)        |d|r|gnd |r|nd ||            g||      }|S # t*        $ r(}t+        dj                  t-        |                  d }~ww xY w)Nz

Raw Chunk: {}

r   contentBlockIndexr   startr  r   )response_tool_namer  	toolUseIdr   r   r   r   r   r   reasoningContentr  r   r   z{}
stopReasonrf   r   trace	assistant)r   r   r   provider_specific_fieldsthinking_blocksreasoning_content)r   r   r  )r  r   r  zReceived streaming error - {}rj   )r   debugr  rz   r   ContentBlockStartEventr  r2   r  r  ContentBlockDeltaEventr  r  r  r  r   converse_config_transform_usager*   r+   r'   r   rp   )rJ   r  r   tool_user   r   r  r  r  r   	start_obj_response_tool_namer  r$  is_empty'model_response_provider_specific_fieldsr  r   r   s                      rS   converse_chunk_parserz+AWSEventStreamDecoder.converse_chunk_parser
  s|   D	L  !8!?!?
!KLD>BHM%)E-/$/3   
':A>?E*$2IZ5HI	&(#( I-)I2F2R.7	.B6.J+-B/B.*
  $44< !%!6!6!: - #,I"6{"C$.(:-/) &*%:%:$ +i7%&89E*.*H*H%&89+ /	:L0M40 J&2IZ5HI	##**95Y&$V,D)+" *$()29)=g)F%
  00< "&!6!6"
 H (94*I6H,I0, )-(J(J!"45)% '+&D&D!"45'O (014-5,.)#z1::<" *$()-% ",,?!@ H + 1*..v2V WJ&'88QS9TU683*$"w/CH7@*$&3##$(!,5=z4 $< !9%),;.?$ )P)H. O 	L;BB3q6JKK	Ls   II 	J	!#JJ	c                 x   d}d}d}d|v r|d   }nd| j                   v r7|j                  d      d   j                  d      j                  d      }d	}d
}nd|v sd|v sd|v sd|v r| j                  |      S d|v r$|j                  dd       }| j                  |      S d|v rMt        |d         dk(  r#|d   d   j                  dd       |d   d   d   }|j                  dd       }|>d	}|}n9d|v r|d   }n/d|v r|d   }n%d|v r|d   }d	}n|j                  dd       rd	}|d   }t	        |||d dd       S )Nr   Fr   r   r   r   r   r   Trf   r  r  metricsr  r  contentBlockDeltar   r  r   r   r   completionReason)r   is_finishedr   r   r   r  )r   r   r  r  GChunk)rJ   r  r   r  r   _chunk_datar   s          rS   _chunk_parserz#AWSEventStreamDecoder._chunk_parser  s    :%l+Dtzz!>>-0377?CCFKDK"M  :-z)J&*$---DD J.$..)<dCK---EE*$Jy)*a/y)!,00>J!),Q/7$..=K&" + Z'l+Dz!f%D
*&7MK^^.5K&'9:M#'
 	
rU   iteratorc              #      K   ddl m}  |       }|D ]W  }|j                  |       |D ]?  }| j                  |      }|st	        j
                  |      }| j                  |       A Y yw)zTGiven an iterator that yields lines, iterate over it & yield every event encounteredr   EventStreamBufferr  Nbotocore.eventstreamr  add_data_parse_message_from_eventr  loadsr  rJ   r  r  event_stream_bufferchunkeventr   rr  s           rS   r   z AWSEventStreamDecoder.iter_bytes  sk      	;/1E((/,88? JJw/E,,,>> - s
   <A-.A-c                   K   ddl m}  |       }|2 3 d{   }|j                  |       |D ]@  }| j                  |      }|st	        j
                  |      }| j                  |       B `7 [6 yw)zZGiven an async iterator that yields lines, iterate over it & yield every event encounteredr   r  Nr  r  r  s           rS   r   z!AWSEventStreamDecoder.aiter_bytes  sx      	;/1# 	? 	?%((/,88? JJw/E,,,>>	 -	?8s+   A6A4A2A4*A6-A62A44A6c                 p   |j                         }| j                  j                  |t                     }|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   r   bodyr   r   r   z:exception-type r   r  bytes)to_response_dictr  r.  r  decoderZ   r|   r   rp   r1   r  r	  )rJ   r  response_dictparsed_responsedecoded_bodyerror_messageexception_statusr  s           rS   r  z/AWSEventStreamDecoder._parse_message_from_event  s6   ..0++++M;T;VW'3.(0779L,- , 0 0 ;L#. , ",Y7;;<MN,s2]BM)-8 "-6 JJ}- 
 '  o%#''0E99W%,,..!%%f-E<<>!rU   )rs   rt   ru   rp   rT   ry   r  )BedrockConverseReasoningContentBlockDeltar	   r  r   r   r!   r    r  r|   r*   r  r  r  r   r  r   r   r   r  rj   rU   rS   r   r     s   4c 4d 4D ,'P	#$G$	U.0SSTU
$>EL EL9L ELN:
:
	v*D0	1:
x? ?	% 3T9:	;? ?%e,?	uV%8$>?	@? "(3-  "rU   r   c            	       J     e Zd Z	 d	dededee   ddf fdZdedefdZ	 xZ
S )
r   Nr   r   r   rH   c                 L    t         |   |       t        d||      | _        y)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)r|  r   r   )r   rT   AnthropicModelResponseIterator!anthropic_model_response_iterator)rJ   r   r   r   rO   s       rS   rT   z+AmazonAnthropicClaudeStreamDecoder.__init__  s+     	u%1O##2
.rU   r  c                 :    | j                   j                  |      S N)r  )r  chunk_parserrJ   r  s     rS   r  z0AmazonAnthropicClaudeStreamDecoder._chunk_parser"  s    55BBBTTrU   r   )rs   rt   ru   rp   ry   r	   rT   r|   r*   r  r  r  s   @rS   r   r     sN    
 %)	

 
 D>	

 

$U U1D UrU   r   c                   H     e Zd Zdededdf fdZdedeee	ef   fdZ
 xZS )r   r   r   rH   Nc                 P    t         |   |       ddlm}  |d |      | _        y )Nr   r   ) AmazonDeepseekR1ResponseIterator)r|  r   )r   rT   Olitellm.llms.bedrock.chat.invoke_transformations.amazon_deepseek_transformationr   deepseek_model_response_iterator)rJ   r   r   r  rO   s       rS   rT   z&AmazonDeepSeekR1StreamDecoder.__init__'  s0    
 	u%	
 1Q##1
-rU   r  c                 :    | j                   j                  |      S r  )r  r  r  s     rS   r  z+AmazonDeepSeekR1StreamDecoder._chunk_parser6  s     44AA
ASSrU   )rs   rt   ru   rp   ry   rT   r|   r   r  r*   r  r  r  s   @rS   r   r   &  sI    

 
 
	
TT	v*D0	1TrU   r   c            	       x    e Zd Zddee   fdZd Zdedeee	      de
eee	   f   fdZdedefd	Zd
 Zd Zd Zy)r   r   c                 .    || _         || _        d| _        y )NF)r   r   is_done)rJ   r   r   s      rS   rT   zMockResponseIterator.__init__=  s    ,"rU   c                     | S r   rj   rk   s    rS   __iter__zMockResponseIterator.__iter__C      rU   r   r   rH   c                     d}| j                   du r>|<t        j                         j                  |      }||j                  xs d}d}||fS |t        |      dkD  r|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   AnthropicConfig!_convert_tool_response_to_messager   r  )rJ   r   r   r  r   s        rS   _handle_json_mode_chunkz,MockResponseIterator._handle_json_mode_chunkF  s    $ ;?>>T!j&<--/QQ% R G "," X~ #J!(;!!}HX~rU   r  c                 J   	 t        |d      }|j                  d   j                  j                  xs d}d }t	        t
        t        t              t	        t        |j                  d         j                  j                        }| j                  du r8| j                  ||j                  d   j                  j                        \  }}nW|Ut        |d   j                  dt        |d   j                  j                   |d   j                  j"                        d      }t%        ||dt'        |j                  d   j(                  xs d	      t+        |j,                  |j.                  |j0                  
      d      }|S # t2        $ r}t5        d| d|       d }~ww xY w)Nr   r   r   T)r   r   r   r   r  )r   r   )r   r  r  r   r   r   zFailed to decode chunk: z	. Error: )r  r  r   r   r   r	   r   r%   r&   r   r   r  r"   r   r#   r   r   r   r  r   r   r$   r   r   r   r   
ValueError)rJ   r  chunk_usager   r  _model_response_tool_callprocessed_chunkr   s           rS   r  z"MockResponseIterator._chunk_parserd  s   '	R!(W!=K%%a(0088>BDH(,;<=Wj0034<<GG)% ~~%!%!=!=)11!4<<GG "> "h +660366#@6q9BBGG";A">"G"G"Q"Q  %! /","4"4Q"7"E"E"K /"-";";&1&C&C!,!9!9
 O #" 	R7
|9QCPQQ	Rs   F F 	F"FF"c                 j    | j                   rt        d| _         | j                  | j                        S NT)r  StopIterationr  r   rk   s    rS   __next__zMockResponseIterator.__next__  s-    <<!!$"5"566rU   c                     | S r   rj   rk   s    rS   	__aiter__zMockResponseIterator.__aiter__  r  rU   c                 r   K   | j                   rt        d| _         | j                  | j                        S wr  )r  StopAsyncIterationr  r   rk   s    rS   	__anext__zMockResponseIterator.__anext__  s1     <<$$!!$"5"566s   57N)F)rs   rt   ru   r	   ry   rT   r  rp   r   r"   r
   r  r)   r  r  r  r  r  rj   rU   rS   r   r   <  su    (4. %-d3N.O%P	sH899	:<(R (R& (RT77rU   r   )FFN)^rv   rL   r  r  r[   urllib.parser-  r  	functoolsr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   litellm.caching.cachingr   'litellm.litellm_core_utils.core_helpersr   *litellm.litellm_core_utils.litellm_loggingr   (litellm.litellm_core_utils.logging_utilsr   3litellm.litellm_core_utils.prompt_templates.factoryr   r   r   r   r   r   r   #litellm.llms.anthropic.chat.handlerr   r  &litellm.llms.custom_httpx.http_handlerr   r   r   r   litellm.types.llms.bedrocklitellm.types.llms.openair    r!   r"   r#   r$   litellm.types.utilsr%   r&   r'   r(   r  r)   r*   r+   r,   litellm.utilsr-   r.   base_aws_llmr0   common_utilsr1   r2   r  r6   rx   1litellm.llms.bedrock.chat.converse_transformationr7   r  r9   rp   r|   r  ry   r  r   r  r   r   r  r   r   r   r   rj   rU   rS   <module>r(     sK              " 1 E > I    )  N M ?  : % U U# ,9s- M  S&(b bZ  %RVU<%&U<U< U< 	U<
 U< U< U< U< ~U< &g&N&NOU<B  %RVN<[!N<N< N< 	N<
 uoN< N< N< N< N< ~N< &g&N&NON<bU7 U7p(G" G"T
U)> U.T$9 T,`7 `7rU   