
    Ng*                        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.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                 ^   t          | t                    r%d| j                                         d| j         }nrt          | t
                    rd| j         d}nQt          | t                    r	| j         }n3t          | t                    rd| j         d}nt          d|            |S )Nz

z: z[INST] z [/INST]z<<SYS>> z	 <</SYS>>zGot unknown type )	
isinstancer   role
capitalizecontentr   r   r   
ValueError)r   message_texts     c/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/bedrock.py$_convert_one_message_to_text_mistralr'       s    ';'' 	8Lgl5577LL7?LL	G\	*	* 8::::	GY	'	' 8!/+	G]	+	+ 8<'/<<<6W66777    messagesc                 @    d                     d | D                       S )z3Convert a list of messages to a prompt for mistral.
c                 ,    g | ]}t          |          S  )r'   ).0r   s     r&   
<listcomp>z6convert_messages_to_prompt_mistral.<locals>.<listcomp>1   s!    OOO7	-g	6	6OOOr(   )joinr)   s    r&   "convert_messages_to_prompt_mistralr2   .   s)    99OOhOOO  r(   	image_urlc                     d}t          j        ||           }|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)typer6   r7   )rematchr$   group)r3   regexr:   s      r&   _format_imager=   5   si     CEHUI&&E}>
 
 	

 kk,//F##  r(   c                    	 d}g }t          |           D ]\  }}|j        dk    r[|dk    rt          d          t          |j        t
                    s$t          dt          |j                             |j        }lt          |j                 }t          |j        t
                    st          |j        t                    s
J d            g }|j        D ]}t          |t
                    r|                    d|d           0t          |t                    rid	|vrt          d
          |d	         dk    r4t          |d         d                   }|                    d|d           |                    |           t          dt          |                     n|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)r8   r@   r8   z&Dict content item must have a type keyr3   urlimage)r8   sourcez0Content items must be str or dict, instead was: )r!   r#   )	enumerater8   r$   r    r#   str_message_type_lookupslistappenddictr=   )	r)   r?   formatted_messagesir   r!   r#   itemrC   s	            r&   _format_anthropic_messagesrM   P   sQ   
 !F%')) 9
 9

7<8##Avv !WXXXgos33  <$($9$9< <   _F$W\2 '/3// #	&  H HGH H H
 G  dC(( NN$*$(      d++ T))()QRRRF|{22!.tK/@/G!H!H(/*0      t,,,,$W4PT::WW  /6 oG!!" 	
 	
 	
 	
 %%%r(   c            
           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dS )ChatPromptAdapterzeAdapter class to prepare the inputs from Langchain to prompt format
    that Chat model expects.
    providerr)   r   c                     |dk    rt          |          }nZ|dk    rt          |          }nC|dk    rt          |          }n,|dk    rt          |dd          }nt          d	| d
          |S )N	anthropicr1   metamistralamazonz

User:z

Bot:)r)   human_prompt	ai_prompt	Provider z model does not support chat.)r   r   r2   NotImplementedError)clsrP   r)   prompts       r&   convert_messages_to_promptz,ChatPromptAdapter.convert_messages_to_prompt   s     {""98LLLFF5xHHHFF""7JJJFF!!9!($  FF &CHCCC   r(   c                 R    |dk    rt          |          S t          d| d          )NrR   rX   z" not supported for format_messages)rM   rY   )rZ   rP   r)   s      r&   format_messagesz!ChatPromptAdapter.format_messages   s=     {""-h777!DDDD
 
 	
r(   N)__name__
__module____qualname____doc__classmethodrE   r   r   r\   r	   r   r   r^   r-   r(   r&   rO   rO      s          &*;&7	   [* 

&*;&7
	x}d4j(	)
 
 
 [
 
 
r(   rO   user	assistant)humanair   HumanMessageChunkfunctionz0.0.34z1.0zlangchain_aws.ChatBedrock)sinceremovalalternative_importc                       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                     dS )zReturn type of chat model.amazon_bedrock_chatr-   )selfs    r&   	_llm_typezBedrockChat._llm_type   s
     %$r(   c                     dS )z9Return whether this model can be serialized by Langchain.Tr-   rZ   s    r&   is_lc_serializablezBedrockChat.is_lc_serializable   s	     tr(   c                 
    g dS )z*Get the namespace of the langchain object.)	langchainchat_modelsbedrockr-   rt   s    r&   get_lc_namespacezBedrockChat.get_lc_namespace   s     7666r(   c                 ,    i }| j         r
| j         |d<   |S )Nregion_name)r|   )rq   
attributess     r&   lc_attributeszBedrockChat.lc_attributes   s%    %'
 	9(,(8J}%r(   forbid)extraNr)   stoprun_managerkwargsc           	   +   :  K   |                                  }d\  }}}|dk    rt                              ||          \  }}nt                              ||          } | j        d|||||d|D ])}	|	j        }
t          t          |
                    V  *d S )NNNNrR   rP   r)   )r[   r?   r)   r   r   r#   r   r-   )_get_providerrO   r^   r\    _prepare_input_and_invoke_streamr@   r   r   )rq   r)   r   r   r   rP   r[   r?   rJ   chunkdeltas              r&   _streamzBedrockChat._stream   s       %%''-=**{""):)J)J(* *&F&& 'AA!H B  F ;T: 
'#
 
 
 
 		M 		ME JE%nU.K.K.KLLLLLLL		M 		Mr(   c           	         d}d| j         i}| j        r | j        |||fi |D ]}||j        z  }n|                                 }d\  }	}
}i |}|dk    rt
                              ||          \  }
}nt
                              ||          }	|r||d<    | j        d|	|||
|d|\  }}||d<   t          t          t          |	          
          g|          S )N model_idr   rR   r   stop_sequences)r[   r   r   r?   r)   usager   r   )generations
llm_outputr-   )r   	streamingr   r@   r   rO   r^   r\   _prepare_input_and_invoker   r   r   )rq   r)   r   r   r   
completionr   r   rP   r[   r?   rJ   params
usage_infos                 r&   	_generatezBedrockChat._generate  se    
&0$-%@
> 	-%hkLLVLL ) )ej(

) ))++H1A.FF.%/ZF;&&->-N-Nh. .*** +EE% F    0+/'(%CT%C &'+& & & &"J
 #-Jw'	*0M0M0MNNNO!
 
 
 	
r(   llm_outputsc                     t          t                    }i }|D ][}|pi }|                    di           }|                                D ]\  }}||xx         |z  cc<   |                    |           \||d<   |S )Nr   )r   intgetitemsupdate)rq   r   final_usagefinal_outputoutputr   
token_typetoken_counts           r&   _combine_llm_outputsz BedrockChat._combine_llm_outputs;  s    &1#&6&6! 	( 	(F\rFJJw++E+0;;== 7 7'
KJ''';6'''''''' +Wr(   r@   c                 r    | j         rt          |          S t                                          |          S N)_model_is_anthropicr   superget_num_tokensrq   r@   	__class__s     r&   r   zBedrockChat.get_num_tokensG  s4    # 	0+D11177))$///r(   c                 r    | j         rt          |          S t                                          |          S r   )r   r   r   get_token_idsr   s     r&   r   zBedrockChat.get_token_idsM  s4    # 	/*400077((...r(   )NN)r_   r`   ra   rb   propertyrE   rr   rc   boolru   r   rz   r   r   r~   r   model_configr   r   r   r   r   r   r   r   rI   r   r   r   r   __classcell__)r   s   @r&   rn   rn      sK        0/%3 % % % X% 4    [ 7c 7 7 7 [7 tCH~    X :  L %):>	M M{#M tCy!M 67	M
 M 
%	&M M M MB %):>	,
 ,
{#,
 tCy!,
 67	,

 ,
 
,
 ,
 ,
 ,
\
Xd^0D 
 
 
 
 
03 03 0 0 0 0 0 0/# /$s) / / / / / / / / / /r(   rn   )/r9   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   rE   r'   r2   r=   rM   rO   rF   rn   r-   r(   r&   <module>r      s   				 # # # # # # D D D D D D D D D D D D D D D D D D 6 6 6 6 6 6      E D D D D D                S R R R R R R R R R            R Q Q Q Q Q 8 8 8 8 8 8       + #    k1B s    S T    6J&;J&
8C=$t*$%J& J& J& J&Z$
 $
 $
 $
 $
 $
 $
 $
P 
!   
E6Q  A/ A/ A/ A/ A/- A/ A/ A/ A/ A/r(   