
    7|h*                        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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 d dlmZmZmZ d d	lmZ d d
lmZ d dl m!Z! d dl"m#Z# d dl$m%Z%m&Z& dede'fdZ(dee   de'fdZ)de'defdZ*dee   de	ee'   ee   f   fdZ+ G d d      Z,ddddddZ- eddd       G d d ee#             Z.y)!    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                 \   t        | t              r,d| j                  j                          d| j                   }|S t        | t
              rd| j                   d}|S t        | t              r| j                   }|S t        | t              rd| j                   d}|S t        d|        )Nz

z: z[INST] z [/INST]z<<SYS>> z	 <</SYS>>zGot unknown type )	
isinstancer   role
capitalizecontentr   r   r   
ValueError)r   message_texts     f/var/www/html/test/engine/venv/lib/python3.12/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                 \    dj                  | D cg c]  }t        |       c}      S c c}w )z3Convert a list of messages to a prompt for mistral.
)joinr'   )r)   r   s     r&   "convert_messages_to_prompt_mistralr-   .   s*    99FNO7	-g	6O Os   )	image_urlc                     d}t        j                  ||       }|t        d      d|j                  d      |j                  d      dS )a  
    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   sX     CEHHUI&E}>
 	

 kk,/F# r(   c                 D   	 d}g }t        |       D ]  \  }}|j                  dk(  rX|dk7  rt        d      t        |j                  t
              s!t        dt        |j                               |j                  }nt        |j                     }t        |j                  t
              st        |j                  t              sJ d       g }|j                  D ]  }t        |t
              r|j                  d|d       (t        |t              rOd	|vrt        d
      |d	   dk(  r&t        |d   d         }|j                  d|d       u|j                  |       t        dt        |              n|j                  }|j                  ||d        ||fS )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%') 9

7<<8#Av !WXXgoos3 $$($9#:<  __F$W\\2 '//3/goot4 H4
 G dC(NN$*$(  d+T)()QRRF|{2!.tK/@/G!H(/*0  t,$J4PT:,W /6 ooG!!"	
i9
t %%%r(   c            
       n    e Zd ZdZededee   defd       Zededee   de	e
e   ee   f   fd       Zy)ChatPromptAdapterzeAdapter class to prepare the inputs from Langchain to prompt format
    that Chat model expects.
    providerr)   r   c                     |dk(  rt        |      }|S |dk(  rt        |      }|S |dk(  rt        |      }|S |dk(  rt        |dd      }|S t        d	| d
      )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)clsrK   r)   prompts       r&   convert_messages_to_promptz,ChatPromptAdapter.convert_messages_to_prompt   s     {"98LF  5xHF  "7JF  !9!($F  &H:%BC r(   c                 @    |dk(  rt        |      S t        d| d      )NrM   rS   z" not supported for format_messages)rH   rT   )rU   rK   r)   s      r&   format_messagesz!ChatPromptAdapter.format_messages   s1     {"-h77!z!CD
 	
r(   N)__name__
__module____qualname____doc__classmethodr@   r   r   rW   r	   r   r   rY    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                   V    e Zd ZdZedefd       Zedefd       Z	ede
e   fd       Zedeeef   fd       Z ed      Z	 	 dd	e
e   d
ee
e      dee   dedee   f
dZ	 	 dd	e
e   d
ee
e      dee   dedef
dZde
ee      defdZdedef fdZdede
e   f fdZ xZS )BedrockChatz%Chat model that uses the Bedrock API.r   c                      y)zReturn type of chat model.amazon_bedrock_chatr_   )selfs    r&   	_llm_typezBedrockChat._llm_type   s     %r(   c                      y)z9Return whether this model can be serialized by Langchain.Tr_   rU   s    r&   is_lc_serializablezBedrockChat.is_lc_serializable   s     r(   c                 
    g dS )z*Get the namespace of the langchain object.)	langchainchat_modelsbedrockr_   rp   s    r&   get_lc_namespacezBedrockChat.get_lc_namespace   s
     76r(   c                 @    i }| j                   r| j                   |d<   |S )Nregion_name)rx   )rm   
attributess     r&   lc_attributeszBedrockChat.lc_attributes   s&    %'
(,(8(8J}%r(   forbid)extrar)   stoprun_managerkwargsc           	   +   &  K   | j                         }d\  }}}|dk(  rt        j                  ||      \  }}nt        j                  ||      } | j                  d|||||d|D ]&  }	|	j
                  }
t        t        |
             ( y w)NNNNrM   rK   r)   )rV   r:   r)   r}   r~   r#   r   r_   )_get_providerrJ   rY   rW    _prepare_input_and_invoke_streamr;   r   r   )rm   r)   r}   r~   r   rK   rV   r:   rE   chunkdeltas              r&   _streamzBedrockChat._stream   s      %%'-=**{"):)J)J(*&F& 'AA!H B F ;T:: 
'#
 
 		ME JJE%nU.KLL		Ms   BBc           	         d}d| j                   i}| j                  r* | j                  |||fi |D ]  }||j                  z  } nw| j	                         }d\  }	}
}i |}|dk(  rt
        j                  ||      \  }
}nt
        j                  ||      }	|r||d<    | j                  d|	|||
|d|\  }}||d<   t        t        t        |	      
      g|      S )N model_idr   rM   r   stop_sequences)rV   r}   r~   r:   r)   usager   r   )generations
llm_outputr_   )r   	streamingr   r;   r   rJ   rY   rW   _prepare_input_and_invoker   r   r   )rm   r)   r}   r~   r   
completionr   r   rK   rV   r:   rE   params
usage_infos                 r&   	_generatezBedrockChat._generate  s&    
&0$--%@
>>%hkLVL )ejj(
) ))+H1A.FF.%/ZF;&->-N-Nh.** +EE% F  +/'(%CT%C%C &'+& &"J
 #-Jw'	*0MNO!
 	
r(   llm_outputsc                     t        t              }i }|D ]P  }|xs i }|j                  di       }|j                         D ]  \  }}||xx   |z  cc<    |j	                  |       R ||d<   |S )Nr   )r   intgetitemsupdate)rm   r   final_usagefinal_outputoutputr   
token_typetoken_counts           r&   _combine_llm_outputsz BedrockChat._combine_llm_outputs;  s    &1#&6! 	(F\rFJJw+E+0;;= 7'
KJ';6'7'	( !,Wr(   r;   c                 P    | j                   rt        |      S t        |   |      S N)_model_is_anthropicr   superget_num_tokensrm   r;   	__class__s     r&   r   zBedrockChat.get_num_tokensG  s'    ##+D117)$//r(   c                 P    | j                   rt        |      S t        |   |      S r   )r   r   r   get_token_idsr   s     r&   r   zBedrockChat.get_token_idsM  s'    ##*4007(..r(   )NN)rZ   r[   r\   r]   propertyr@   rn   r^   boolrq   r   rv   r   r   rz   r   model_configr   r   r   r   r   r   r   r   rD   r   r   r   r   __classcell__)r   s   @r&   rj   rj      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(   rj   )/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   rj   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(   