
    dh*                        S SK r S SKJr  S SKJrJrJrJrJrJ	r	J
r
  S SKJr  S SKJr  S SKJr  S SKJrJrJrJrJrJr  S SKJrJrJr  S S	KJr  S S
KJr  S SK J!r!  S SK"J#r#  S SK$J%r%J&r&  S\S\'4S jr(S\\   S\'4S jr)S\'S\4S jr*S\\   S\	\\'   \\   4   4S jr+ " S S5      r,SSSSSS.r-\" SSSS9 " S S \\#5      5       r.g)!    N)defaultdict)AnyDictIteratorListOptionalTupleUnion)
deprecated)CallbackManagerForLLMRun)BaseChatModel)	AIMessageAIMessageChunkBaseMessageChatMessageHumanMessageSystemMessage)ChatGenerationChatGenerationChunk
ChatResult)
ConfigDict)$convert_messages_to_prompt_anthropic) convert_messages_to_prompt_llama)BedrockBase)get_num_tokens_anthropicget_token_ids_anthropicmessagereturnc                    [        U [        5      (       a,  SU R                  R                  5        SU R                   3nU$ [        U [
        5      (       a  SU R                   S3nU$ [        U [        5      (       a  U R                   nU$ [        U [        5      (       a  SU R                   S3nU$ [        SU  35      e)Nz

z: z[INST] z [/INST]z<<SYS>> z	 <</SYS>>zGot unknown type )	
isinstancer   role
capitalizecontentr   r   r   
ValueError)r   message_texts     _/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/bedrock.py$_convert_one_message_to_text_mistralr'       s    ';''gll55787??:KL  
G\	*	*  1:  
GY	'	'!//*
 	 
G]	+	+!'//!2)<  ,WI677    messagesc                 `    SR                  U  Vs/ sH  n[        U5      PM     sn5      $ s  snf )z3Convert a list of messages to a prompt for mistral.
)joinr'   )r)   r   s     r&   "convert_messages_to_prompt_mistralr-   .   s.    99FNOh7	-g	6hO Os   +	image_urlc                     Sn[         R                  " X5      nUc  [        S5      eSUR                  S5      UR                  S5      S.$ )z
Formats an image of format data:image/jpeg;base64,{b64_string}
to a dict for anthropic api

{
  "type": "base64",
  "media_type": "image/jpeg",
  "data": "/9j/4AAQSkZJRg...",
}

And throws an error if it's not a b64 image
z3^data:(?P<media_type>image/.+);base64,(?P<data>.+)$zgAnthropic only supports base64-encoded images currently. Example: data:image/png;base64,'/9j/4AAQSk'...base64
media_typedata)typer1   r2   )rematchr$   group)r.   regexr5   s      r&   _format_imager8   5   sV     CEHHU&E}>
 	

 kk,/F# r(   c                     Sn/ n[        U 5       GH  u  p4UR                  S:X  a_  US:w  a  [        S5      e[        UR                  [
        5      (       d!  [        S[        UR                  5       35      eUR                  nMu  [        UR                     n[        UR                  [
        5      (       d  [        UR                  [        5      (       d   S5       e/ nUR                   H  n[        U[
        5      (       a  UR                  SUS.5        M.  [        U[        5      (       aT  S	U;  a  [        S
5      eUS	   S:X  a'  [        US   S   5      nUR                  SUS.5        M  UR                  U5        M  [        S[        U5       35      e   OUR                  nUR                  UUS.5        GM     X4$ )zFormat messages for anthropic.Nsystemr   z4System message must be at beginning of message list.z.System message must be a string, instead was: z6Anthropic message content must be str or list of dictstext)r3   r;   r3   z&Dict content item must have a type keyr.   urlimage)r3   sourcez0Content items must be str or dict, instead was: )r!   r#   )	enumerater3   r$   r    r#   str_message_type_lookupslistappenddictr8   )	r)   r:   formatted_messagesir   r!   r#   itemr>   s	            r&   _format_anthropic_messagesrH   P   s   
 !F%')
<<8#Av !WXXgoos33 $$($9#:<  __F$W\\2 '//3//goot44 H4
 GdC((NN$*$(  d++T)()QRRF|{2!.tK/@/G!H(/*0  t,$J4PT:,W / (6 ooG!!"	
i *t %%r(   c            
       z    \ rS rSrSr\S\S\\   S\4S j5       r	\S\S\\   S\
\\   \\   4   4S j5       rSrg	)
ChatPromptAdapter   z]Adapter class to prepare the inputs from Langchain to prompt format
that Chat model expects.
providerr)   r   c                     US:X  a  [        US9nU$ US:X  a  [        US9nU$ US:X  a  [        US9nU$ US:X  a  [        USSS9nU$ [        S	U S
35      e)N	anthropic)r)   metamistralamazonz

User:z

Bot:)r)   human_prompt	ai_prompt	Provider z model does not support chat.)r   r   r-   NotImplementedError)clsrL   r)   prompts       r&   convert_messages_to_prompt,ChatPromptAdapter.convert_messages_to_prompt   s     {"98LF  5xHF  "7JF  !9!($F  &H:%BC r(   c                 B    US:X  a  [        U5      $ [        SU S35      e)NrN   rT   z" not supported for format_messages)rH   rU   )rV   rL   r)   s      r&   format_messages!ChatPromptAdapter.format_messages   s1     {"-h77!z!CD
 	
r(    N)__name__
__module____qualname____firstlineno____doc__classmethodr@   r   r   rX   r	   r   r   r[   __static_attributes__r]   r(   r&   rJ   rJ      s{     &*;&7	 * 

&*;&7
	x}d4j(	)
 
r(   rJ   user	assistant)humanair   HumanMessageChunkfunctionz0.0.34z1.0zlangchain_aws.ChatBedrock)sinceremovalalternative_importc                   r  ^  \ rS rSrSr\S\4S j5       r\S\	4S j5       r
\S\\   4S j5       r\S\\\4   4S j5       r\" SS	9r  SS
\\   S\\\      S\\   S\S\\   4
S jjr  SS
\\   S\\\      S\\   S\S\4
S jjrS\\\      S\4S jrS\S\4U 4S jjrS\S\\   4U 4S jjrSrU =r $ )BedrockChat   z%Chat model that uses the Bedrock API.r   c                     g)zReturn type of chat model.amazon_bedrock_chatr]   )selfs    r&   	_llm_typeBedrockChat._llm_type   s     %r(   c                     g)z9Return whether this model can be serialized by Langchain.Tr]   rV   s    r&   is_lc_serializableBedrockChat.is_lc_serializable   s     r(   c                 
    / SQ$ )z*Get the namespace of the langchain object.)	langchainchat_modelsbedrockr]   rw   s    r&   get_lc_namespaceBedrockChat.get_lc_namespace   s
     76r(   c                 J    0 nU R                   (       a  U R                   US'   U$ )Nregion_name)r   )rs   
attributess     r&   lc_attributesBedrockChat.lc_attributes   s&    %'
(,(8(8J}%r(   forbid)extrar)   stoprun_managerkwargsc           	   +     #    U R                  5       nSu  pgnUS:X  a  [        R                  XQ5      u  pxO[        R                  XQS9nU R                  " SUUUUUS.UD6 H!  n	U	R
                  n
[        [        U
S9S9v   M#     g 7f)NNNNrN   rL   r)   )rW   r:   r)   r   r   r#   r   r]   )_get_providerrJ   r[   rX    _prepare_input_and_invoke_streamr;   r   r   )rs   r)   r   r   r   rL   rW   r:   rE   chunkdeltas              r&   _streamBedrockChat._stream   s      %%'-=**{"):)J)J*&F& 'AA! B F :: 
'#
 
E JJE%nU.KLL
s   BBc           	         SnSU R                   0nU R                  (       a*  U R                  " XU40 UD6 H  nXWR                  -  nM     OsU R	                  5       nSu  pn0 UEnUS:X  a  [
        R                  X5      u  pO[
        R                  XS9n	U(       a  X,S'   U R                  " SU	UUU
US.UD6u  p]XS'   [        [        [        US	9S
9/US9$ )N model_idr   rN   r   stop_sequences)rW   r   r   r:   r)   usager   r   )generations
llm_outputr]   )r   	streamingr   r;   r   rJ   r[   rX   _prepare_input_and_invoker   r   r   )rs   r)   r   r   r   
completionr   r   rL   rW   r:   rE   params
usage_infos                 r&   	_generateBedrockChat._generate  s    
&0$--%@
>>hkLVLjj(
 M ))+H1A.F.%/ZF;&->-N-N.** +EE% F  +/'(%)%C%C &'+& &"J #-w'	*0MNO!
 	
r(   llm_outputsc                     [        [        5      n0 nU HV  nU=(       d    0 nUR                  S0 5      nUR                  5        H  u  pgX&==   U-  ss'   M     UR	                  U5        MX     X#S'   U$ )Nr   )r   intgetitemsupdate)rs   r   final_usagefinal_outputoutputr   
token_typetoken_counts           r&   _combine_llm_outputs BedrockChat._combine_llm_outputs;  ss    &1#&6!F\rFJJw+E+0;;='
';6' ,9' " !,Wr(   r;   c                 Z   > U R                   (       a  [        U5      $ [        TU ]  U5      $ N)_model_is_anthropicr   superget_num_tokensrs   r;   	__class__s     r&   r   BedrockChat.get_num_tokensG  s'    ##+D117)$//r(   c                 Z   > U R                   (       a  [        U5      $ [        TU ]  U5      $ r   )r   r   r   get_token_idsr   s     r&   r   BedrockChat.get_token_idsM  s'    ##*4007(..r(   r]   )NN)!r^   r_   r`   ra   rb   propertyr@   rt   rc   boolrx   r   r~   r   r   r   r   model_configr   r   r   r   r   r   r   r   rD   r   r   r   r   rd   __classcell__)r   s   @r&   ro   ro      s    0%3 % % 4   7c 7 7 tCH~   L %):>	M{#M tCy!M 67	M
 M 
%	&MB %):>	,
{#,
 tCy!,
 67	,

 ,
 
,
\
Xd^0D 
 
03 03 0/# /$s) / /r(   ro   )/r4   collectionsr   typingr   r   r   r   r   r	   r
   langchain_core._api.deprecationr   langchain_core.callbacksr   *langchain_core.language_models.chat_modelsr   langchain_core.messagesr   r   r   r   r   r   langchain_core.outputsr   r   r   pydanticr   )langchain_community.chat_models.anthropicr   $langchain_community.chat_models.metar    langchain_community.llms.bedrockr   'langchain_community.utilities.anthropicr   r   r@   r'   r-   r8   rH   rJ   rA   ro   r]   r(   r&   <module>r      s
   	 # D D D 6 E  S R  R 8+ # k1B s S T 6J&;J&
8C=$t*$%J&Z$
 $
P 
!  
E6QA/- A/A/r(   