o
    Zh*                     @   sr  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dZ(dee de'fddZ)de'defddZ*dee de	ee' ee f fddZ+G dd dZ,ddddddZ-edd d!d"G d#d$ d$ee#Z.dS )%    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                 C   s   t | trd| 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_text r$   ^/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/bedrock.py$_convert_one_message_to_text_mistral    s   
	


r&   messagesc                 C   s   d dd | D S )z3Convert a list of messages to a prompt for mistral.
c                 S   s   g | ]}t |qS r$   )r&   ).0r   r$   r$   r%   
<listcomp>1   s    z6convert_messages_to_prompt_mistral.<locals>.<listcomp>)joinr'   r$   r$   r%   "convert_messages_to_prompt_mistral.   s   r-   	image_urlc                 C   s8   d}t || }|du rtdd|d|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>.+)$NzgAnthropic only supports base64-encoded images currently. Example: data:image/png;base64,'/9j/4AAQSk'...base64
media_typedata)typer0   r1   )rematchr"   group)r.   regexr4   r$   r$   r%   _format_image5   s   r7   c           	      C   s8  	 d}g }t | D ]\}}|jdkr.|dkrtdt|jts*tdt|j |j}q	t|j }t|jtst|jtsCJ dg }|jD ]B}t|trX|d|d qHt|t	rd	|vretd
|d	 dkr|t
|d d }|d|d qH|| qHtdt| n|j}|||d q	||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)r2   r9   r2   z&Dict content item must have a type keyr.   urlimage)r2   sourcez0Content items must be str or dict, instead was: )r   r!   )	enumerater2   r"   r   r!   str_message_type_lookupslistappenddictr7   )	r'   r8   formatted_messagesir   r   r!   itemr<   r$   r$   r%   _format_anthropic_messagesP   sd   	




rF   c                
   @   s\   e Zd ZdZededee defddZededee de	e
e ee f fddZd	S )
ChatPromptAdapterzeAdapter class to prepare the inputs from Langchain to prompt format
    that Chat model expects.
    providerr'   r   c                 C   sl   |dkrt |d}|S |dkrt|d}|S |dkr!t|d}|S |dkr.t |ddd}|S td	| d
)N	anthropicr,   metaZmistralZamazonz

User:z

Bot:)r'   Zhuman_promptZ	ai_prompt	Provider z model does not support chat.)r   r   r-   NotImplementedError)clsrH   r'   promptr$   r$   r%   convert_messages_to_prompt   s&   


	
z,ChatPromptAdapter.convert_messages_to_promptc                 C   s    |dkrt |S td| d)NrI   rK   z" not supported for format_messages)rF   rL   )rM   rH   r'   r$   r$   r%   format_messages   s
   
z!ChatPromptAdapter.format_messagesN)__name__
__module____qualname____doc__classmethodr>   r   r   rO   r   r   r   rP   r$   r$   r$   r%   rG      s$    rG   userZ	assistant)ZhumanZair   ZHumanMessageChunkfunctionz0.0.34z1.0zlangchain_aws.ChatBedrock)ZsinceZremovalZalternative_importc                       s(  e Zd ZdZedefddZedefddZ	ede
e fddZedeeef fd	d
ZeddZ		dde
e dee
e  dee dedee f
ddZ		dde
e dee
e  dee dedef
ddZde
ee  defddZdedef fddZdede
e f fddZ  ZS )BedrockChatz%Chat model that uses the Bedrock API.r   c                 C      dS )zReturn type of chat model.Zamazon_bedrock_chatr$   )selfr$   r$   r%   	_llm_type      zBedrockChat._llm_typec                 C   rY   )z9Return whether this model can be serialized by Langchain.Tr$   rM   r$   r$   r%   is_lc_serializable   r\   zBedrockChat.is_lc_serializablec                 C   s   g dS )z*Get the namespace of the langchain object.)Z	langchainZchat_modelsZbedrockr$   r]   r$   r$   r%   get_lc_namespace   s   zBedrockChat.get_lc_namespacec                 C   s   i }| j r
| j |d< |S )Nregion_name)r`   )rZ   
attributesr$   r$   r%   lc_attributes   s   
zBedrockChat.lc_attributesZforbid)extraNr'   stoprun_managerkwargsc                 k   sz    |   }d\}}}|dkrt||\}}ntj||d}| jd|||||d|D ]}	|	j}
tt|
ddV  q,d S )NNNNrI   rH   r'   )rN   r8   r'   rd   re   r!   r   r$   )_get_providerrG   rP   rO   Z _prepare_input_and_invoke_streamr9   r   r   )rZ   r'   rd   re   rf   rH   rN   r8   rC   chunkdeltar$   r$   r%   _stream   s,   


zBedrockChat._streamc                 K   s   d}d| j i}| jr| j|||fi |D ]}||j7 }qn;|  }d\}	}
}i |}|dkr8t||\}
}ntj||d}	|rE||d< | jd|	|||
|d|\}}||d< t	t
t|d	d
g|dS )N model_idrg   rI   rh   Zstop_sequences)rN   rd   re   r8   r'   usageri   rj   )Zgenerations
llm_outputr$   )rp   Z	streamingrn   r9   rk   rG   rP   rO   Z_prepare_input_and_invoker   r   r   )rZ   r'   rd   re   rf   
completionrr   rl   rH   rN   r8   rC   paramsZ
usage_infor$   r$   r%   	_generate  s@   



	zBedrockChat._generatellm_outputsc                 C   sb   t t}i }|D ]"}|pi }|di }| D ]\}}||  |7  < q|| q||d< |S )Nrq   )r   intgetitemsupdate)rZ   rv   Zfinal_usageZfinal_outputoutputrq   
token_typeZtoken_countr$   r$   r%   _combine_llm_outputs;  s   z BedrockChat._combine_llm_outputsr9   c                       | j rt|S t |S N)_model_is_anthropicr   superget_num_tokensrZ   r9   	__class__r$   r%   r   G     zBedrockChat.get_num_tokensc                    r~   r   )r   r   r   get_token_idsr   r   r$   r%   r   M  r   zBedrockChat.get_token_ids)NN)rQ   rR   rS   rT   propertyr>   r[   rU   boolr^   r   r_   r   r   rb   r   Zmodel_configr   r   r   r   r   rn   r   ru   rB   r}   rw   r   r   __classcell__r$   r$   r   r%   rX      sT    

!

."rX   )/r3   collectionsr   typingr   r   r   r   r   r   r	   Zlangchain_core._api.deprecationr
   Zlangchain_core.callbacksr   Z*langchain_core.language_models.chat_modelsr   Zlangchain_core.messagesr   r   r   r   r   r   Zlangchain_core.outputsr   r   r   Zpydanticr   Z)langchain_community.chat_models.anthropicr   Z$langchain_community.chat_models.metar   Z langchain_community.llms.bedrockr   Z'langchain_community.utilities.anthropicr   r   r>   r&   r-   r7   rF   rG   r?   rX   r$   r$   r$   r%   <module>   s@    $ 
M(	