
    dhY9                     
   S SK r S SKJrJrJrJrJrJrJrJ	r	  S SK
Jr  S SKJrJr  S SKJr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Jr  \" S	S
S9S\ S\4S j5       r!S\ S\4S jr"\" SSSS9 " S S\\5      5       r#g)    N)AnyAsyncIteratorDictIteratorListOptionalUnioncast)
deprecated)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModelLangSmithParams)	AIMessageAIMessageChunkBaseMessageChatMessageHumanMessageSystemMessage)ChatGenerationChatGenerationChunk
ChatResult)OllamaEndpointNotFoundError_OllamaCommon0.0.3._chat_stream_response_to_chat_generation_chunkalternativestream_responsereturnc                     [         R                  " U 5      nUR                  S5      SL a  UOSn[        [	        UR                  SS5      S9US9$ )0Convert a stream response to a generation chunk.doneTNresponse contentmessagegeneration_infojsonloadsgetr   r   r   parsed_responser*   s      ^/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/ollama.py)_stream_response_to_chat_generation_chunkr2      sQ    
 jj1O)8)<)<V)D)LoRVO':'::r'JK'     c                     [         R                  " U 5      nUR                  S5      SL a  UOSn[        [	        UR                  S0 5      R                  SS5      S9US9$ )	r"   r#   TNr)   r'   r%   r&   r(   r+   r/   s      r1   r   r   $   sc     jj1O)8)<)<V)D)LoRVO#''	26::9bI
 (	 r3   z0.3.1z1.0.0zlangchain_ollama.ChatOllama)sinceremovalalternative_importc                   :   \ rS rSrSr\S\4S j5       r\S\	4S j5       r
 SS\\\      S\S\4S	 jjr\" S
SS9S\S\4S j5       rS\\   S\4S jrS\\   S\\\\\\\   4   4      4S jr SS\\   S\\\      S\S\\   4S jjr SS\\   S\\\      S\S\\   4S jjr   S S\\   S\\\      S\\   S\	S\S\4S jjr   S S\\   S\\\      S\\   S\	S\S\4S jj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\\   S\\\      S\\   S\S\\   4
S jjr#  S!S\\   S\\\      S\\   S\S\\   4
S jjr$\" S
SS9  S!S\\   S\\\      S\\   S\S\\   4
S jj5       r%Sr&g)"
ChatOllama2   zOllama locally runs large language models.

To use, follow the instructions at https://ollama.ai/.

Example:
    .. code-block:: python

        from langchain_community.chat_models import ChatOllama
        ollama = ChatOllama(model="llama2")
r    c                     g)zReturn type of chat model.zollama-chat )selfs    r1   	_llm_typeChatOllama._llm_typeC   s     r3   c                     g)z9Return whether this model can be serialized by Langchain.Fr<   )clss    r1   is_lc_serializableChatOllama.is_lc_serializableH   s     r3   Nstopkwargsc           	      N   U R                   " S
SU0UD6n[        SU R                  SUR                  SU R                  5      S9nUR                  SU R
                  5      =n(       a  XTS'   U=(       d%    UR                  SS5      =(       d    U R                  =n(       a  XdS	'   U$ )z Get standard params for tracing.rD   ollamachattemperature)ls_providerls_model_namels_model_typels_temperaturenum_predictls_max_tokensNls_stopr<   )_get_invocation_paramsr   modelr.   rI   rN   rD   )r=   rD   rE   params	ls_paramsrO   rP   s          r1   _get_ls_paramsChatOllama._get_ls_paramsM   s     ,,A$A&A# ** !::mT5E5EF	
	 #JJ}d6F6FGG=G)6o&Cfjj6C$))C7C#*i r3   r   $_convert_messages_to_ollama_messagesr   r)   c                 p   [        U[        5      (       a,  SUR                  R                  5        SUR                   3nU$ [        U[
        5      (       a  [        UR                  [        5      (       aV  [        [        [           UR                  5      S   nUR                  S5      nUS:X  a  SUS    S3nU$ US:X  a  US   S	   nW$ 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: r   typetextz[INST] z [/INST]	image_urlurlz<<SYS>> z	 <</SYS>>zGot unknown type )
isinstancer   role
capitalizer'   r   r   r
   r   r.   r   r   
ValueError)r=   r)   message_textfirst_contentcontent_types        r1   _format_message_as_text"ChatOllama._format_message_as_text^   sI   g{++!',,"9"9";!<Bw>OPL" ! ..'//400 $T$Z A! D,0086)%,]6-B,C8#LL  "[0#0#=e#DL  ")(9B  ++%oo.L
 	 //%goo%6i@L  0	:;;r3   messagesc                 j    SR                  U Vs/ sH  o R                  U5      PM     sn5      $ s  snf )N
)joinrd   )r=   rf   r)   s      r1   _format_messages_as_text#ChatOllama._format_messages_as_textt   s1    yyBJK(w))'2(K
 	
Ks   0c                 r   / nU GH  nSn[        U[        5      (       a  SnO;[        U[        5      (       a  SnO#[        U[        5      (       a  SnO[	        S5      eSn/ n[        UR
                  [        5      (       a  UR
                  nGO[        [        [           UR
                  5       H  nUR                  S5      S:X  a  USUS    3-  nM%  UR                  S5      S	:X  a  S nUR                  S	5      n	[        U	[        5      (       a  US	   nO,[        U	[        5      (       a  S
U	;   a  U	S
   nO[	        S5      eUR                  S5      n
[        U
5      S:  a  UR                  U
S   5        M  UR                  U
S   5        M  [	        S5      e   UR                  UUUS.5        GM     U$ )Nr%   user	assistantsystemz-Received unsupported message type for Ollama.rY   rZ   rh   r[   r\   zSOnly string image_url or dict with string 'url' inside content parts are supported.,   r   zsUnsupported message content type. Must either have type 'text' or type 'image_url' with a string 'image_url' field.)r^   r'   images)r]   r   r   r   r`   r'   strr
   r   r   r.   dictsplitlenappend)r=   rf   ollama_messagesr)   r^   r'   rr   content_partr[   temp_image_urlimage_url_componentss              r1   rW   /ChatOllama._convert_messages_to_ollama_messagesy   s    !#GD'<00GY//"G]33 !PQQGF'//3//!//$(dW__$EL#''/69RV(<'=#>>%))&1[@$(	)5)9)9+)F%nc::(4[(AI&~t<<.AX(6u(=I",!F# 
 09s/C, 34q8"MM*>q*AB"MM*>q*AB )? 7 %FB "" &$c  r r3   c              +      #    U R                   U R                  U5      S.nU R                  " SXBU R                   S3S.UD6 S h  vN   g  N7fN)rR   rf   z	/api/chat)payloadrD   api_urlr<   )rR   rW   _create_streambase_url)r=   rf   rD   rE   r   s        r1   _create_chat_streamChatOllama._create_chat_stream   sZ      ZZAA(K
 && 
4==/0K
OU
 	
 	
s   AAAAc                   #    U R                   U R                  U5      S.nU R                  " SXBU R                   S3S.UD6  S h  vN nU7v   M   N
 g 7fr~   )rR   rW   _acreate_streamr   )r=   rf   rD   rE   r   stream_resps         r1   _acreate_chat_streamChatOllama._acreate_chat_stream   si      ZZAA(K
 "&!5!5 "
4==/0K"
OU"
 	+ 	 "
s*   AAAAAAAArun_managerverbosec                     S nU R                   " X40 UD6 HE  nU(       d  M  [        U5      nUc  UnOXh-  nU(       d  M*  UR                  UR                  UUS9  MG     Uc  [	        S5      eU$ Nchunkr   z$No data received from Ollama stream.)r   r   on_llm_new_tokenrZ   r`   	r=   rf   rD   r   r   rE   final_chunkr   r   s	            r1   _chat_stream_with_aggregation(ChatOllama._chat_stream_with_aggregation   s     6:33HMfMK{F{S&"'K(K;00

# ' 1  N CDDr3   c                   #    S nU R                   " X40 UD6  S h  vN nU(       d  M  [        U5      nUc  UnOXh-  nU(       d  M0  UR                  UR                  UUS9I S h  vN   MU   NP N
 Uc  [	        S5      eU$ 7fr   )r   r   r   rZ   r`   r   s	            r1   _achat_stream_with_aggregation)ChatOllama._achat_stream_with_aggregation   s      6:!%!:!:8!TV!T 	+{F{S&"'K(K;%66

# ' 7   	 "U CDDsB   BA1A-A1BBB&A/'B-A1/B1Bc                     U R                   " U4UUU R                  S.UD6n[        [        UR                  S9UR
                  S9n[        U/S9$ )l  Call out to Ollama's generate endpoint.

Args:
    messages: The list of base messages to pass into the model.
    stop: Optional list of stop words to use when generating.

Returns:
    Chat generations from the model

Example:
    .. code-block:: python

        response = ollama([
            HumanMessage(content="Tell me about the history of AI")
        ])
rD   r   r   r&   r(   generations)r   r   r   r   rZ   r*   r   r=   rf   rD   r   rE   r   chat_generations          r1   	_generateChatOllama._generate  sf    0 88
#LL	

 
 )k&6&67'77
 &788r3   c                    #    U R                   " U4UUU R                  S.UD6I Sh  vN n[        [        UR                  S9UR
                  S9n[        U/S9$  N37f)r   r   Nr&   r(   r   )r   r   r   r   rZ   r*   r   r   s          r1   
_agenerateChatOllama._agenerate0  ss     0 !??
#LL	

 
 
 )k&6&67'77
 &788
s   %AA4Ac              +   "  #     U R                   " X40 UD6 HG  nU(       d  M  [        U5      nU(       a%  UR                  UR                  UU R                  S9  Uv   MI     g ! [
         a    U R                  " X40 UD6 S h  vN     g f = f7fNr   )r   r   r   rZ   r   r   _legacy_streamr=   rf   rD   r   rE   r   r   s          r1   _streamChatOllama._streamU  s     	E#77Q&Q;J;WE"#44!JJ"'$(LL 5 
  K  R + 	E**8DVDDD	Es9   BA# ?A# "B# BBB	BBBc                   #    U R                   " X40 UD6  S h  vN nU(       d  M  [        U5      nU(       a-  UR                  UR                  UU R                  S9I S h  vN   U7v   MX   NS N
 g 7fr   )r   r   r   rZ   r   r   s          r1   _astreamChatOllama._astreamj  sx      "&!:!:8!TV!T 		+{F{S%66

# $ 7   
 			 "Us<   A4A2A.A2A4:A4"A0#A4.A20A42A4r   c              +      #    U R                  U5      nU R                  " XR40 UD6 HG  nU(       d  M  [        U5      nU(       a%  UR                  UR                  UU R
                  S9  Uv   MI     g 7fr   )rj   _create_generate_streamr2   r   rZ   r   )r=   rf   rD   r   rE   promptr   r   s           r1   r   ChatOllama._legacy_stream|  so      ..x877OOK{A+N00

# $ 1 
  Ps   -A3A A3r<   )N)NNF)NN)'__name__
__module____qualname____firstlineno____doc__propertyrs   r>   classmethodboolrB   r   r   r   r   rU   r   r   rd   rj   r   r	   rW   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__r<   r3   r1   r9   r9   2   s   	 3   4  
 +/T#Y':=	" %KL{ s  M*
k1B 
s 

=[)=	d3c49n--.	/=D %)
{#
 tCy!
 	

 
#
" %){# tCy! 	
 
s	$ %):>{# tCy! 67	
   
< %)?C{# tCy! ;<	
   
< %):>	#9{##9 tCy!#9 67	#9
 #9 
#9P %)?C	#9{##9 tCy!#9 ;<	#9
 #9 
#9P %):>	E{#E tCy!E 67	E
 E 
%	&E0 %)?C	{# tCy! ;<	
  
*	+$ Y/ %):>	{# tCy! 67	
  
%	& 0r3   r9   )$r,   typingr   r   r   r   r   r   r	   r
   langchain_core._apir   langchain_core.callbacksr   r   *langchain_core.language_models.chat_modelsr   r   langchain_core.messagesr   r   r   r   r   r   langchain_core.outputsr   r   r   langchain_community.llms.ollamar   r   rs   r2   r   r9   r<   r3   r1   <module>r      s     R R R * V  S R V G!QR			 S	 
4
W W
Wr3   