
    7|hY9                        d dl Z d dlmZmZmZmZmZmZmZm	Z	 d dl
mZ d dlmZmZ d dlmZ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mZ  ed	d
      de defd       Z!de defdZ" eddd       G d dee             Z#y)    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                     t        j                  |       }|j                  d      du r|nd}t        t	        |j                  dd            |      S )0Convert a stream response to a generation chunk.doneTNresponse contentmessagegeneration_infojsonloadsgetr   r   r   parsed_responser*   s      e/var/www/html/test/engine/venv/lib/python3.12/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                     t        j                  |       }|j                  d      du r|nd}t        t	        |j                  di       j                  dd            |      S )	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                      e Zd ZdZedefd       Zedefd       Z		 dde
ee      dedefdZ ed	d
      dedefd       Zdee   defdZdee   deeeeeee   f   f      fdZ	 ddee   de
ee      dedee   fdZ	 ddee   de
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defdZ	 	 	 ddee   de
ee      de
e   dededefdZ	 	 ddee   de
ee      de
e   dedef
dZ 	 	 ddee   de
ee      de
e   dedef
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e   f
dZ# ed	d      	 	 ddee   de
ee      de
e   dedee   f
d       Z$y) 
ChatOllamaa  Ollama 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                      y)zReturn type of chat model.zollama-chat )selfs    r1   	_llm_typezChatOllama._llm_typeC   s     r3   c                      y)z9Return whether this model can be serialized by Langchain.Fr;   )clss    r1   is_lc_serializablezChatOllama.is_lc_serializableH   s     r3   Nstopkwargsc           	      0    | j                   d
d|i|}t        d| j                  d|j                  d| j                              }|j                  d| j
                        x}r||d<   |xs  |j                  dd      xs | j                  x}r||d	<   |S )z Get standard params for tracing.rA   ollamachattemperature)ls_providerls_model_namels_model_typels_temperaturenum_predictls_max_tokensNls_stopr;   )_get_invocation_paramsr   modelr.   rF   rK   rA   )r<   rA   rB   params	ls_paramsrL   rM   s          r1   _get_ls_paramszChatOllama._get_ls_paramsM   s     -,,A$A&A# ** !::mT5E5EF	
	 #JJ}d6F6FGG=G)6Io&Cfjj6C$))C7C#*Ii r3   r   $_convert_messages_to_ollama_messagesr   r)   c                 8   t        |t              r,d|j                  j                          d|j                   }|S t        |t
              rt        |j                  t              rTt        t        t           |j                        d   }|j                  d      }|dk(  rd|d    d}|S |dk(  r|d   d	   }|S d|j                   d}S t        |t              r|j                   }|S t        |t              rd
|j                   d}|S t        d|       )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_textz"ChatOllama._format_message_as_text^   s:   g{+!',,"9"9";!<Bw>OPL" ! .'//4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                 h    dj                  |D cg c]  }| j                  |       c}      S c c}w )N
)joinr`   )r<   ra   r)   s      r1   _format_messages_as_textz#ChatOllama._format_messages_as_textt   s/    yyBJKwT))'2K
 	
Ks   /c                    g }|D ]  }d}t        |t              rd}n1t        |t              rd}nt        |t              rd}nt	        d      d}g }t        |j
                  t              r|j
                  }nt        t        t           |j
                        D ]  }|j                  d      dk(  r|d|d    z  }#|j                  d      d	k(  rd }|j                  d	      }	t        |	t              r|d	   }n%t        |	t              r
d
|	v r|	d
   }nt	        d      |j                  d      }
t        |
      dkD  r|j                  |
d          |j                  |
d          t	        d       |j                  |||d        |S )Nr%   user	assistantsystemz-Received unsupported message type for Ollama.rU   rV   rc   rW   rX   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.)rZ   r'   images)rY   r   r   r   r\   r'   strr
   r   r   r.   dictsplitlenappend)r<   ra   ollama_messagesr)   rZ   r'   rl   content_partrW   temp_image_urlimage_url_componentss              r1   rS   z/ChatOllama._convert_messages_to_ollama_messagesy   s    !# 7	GD'<0GY/"G]3 !PQQGF'//3/!//$(dW__$E L#''/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B "" &$c7	r r3   c              +      K   | j                   | j                  |      d} | j                  d||| j                   dd|E d {    y 7 wN)rO   ra   z	/api/chat)payloadrA   api_urlr;   )rO   rS   _create_streambase_url)r<   ra   rA   rB   rx   s        r1   _create_chat_streamzChatOllama._create_chat_stream   s_      ZZAA(K
 '4&& 
$4==/0K
OU
 	
 	
s   AAAAc                   K   | j                   | j                  |      d} | j                  d||| j                   dd|2 3 d {   }| 7 
6 y wrw   )rO   rS   _acreate_streamr{   )r<   ra   rA   rB   rx   stream_resps         r1   _acreate_chat_streamzChatOllama._acreate_chat_stream   st      ZZAA(K
 "6!5!5 "
$4==/0K"
OU"
 	 	+ 	 "
s*   AAAA	AAAArun_managerverbosec                     d } | j                   ||fi |D ];  }|st        |      }||}n||z  }|s|j                  |j                  ||       = |t	        d      |S Nchunkr   z$No data received from Ollama stream.)r|   r   on_llm_new_tokenrV   r\   	r<   ra   rA   r   r   rB   final_chunkr   r   s	            r1   _chat_stream_with_aggregationz(ChatOllama._chat_stream_with_aggregation   s     6:3433HdMfM 	KF{S&"'K5(K00

# ' 1 	 CDDr3   c                    K   d } | j                   ||fi |2 3 d {   }|st        |      }||}n||z  }|s$|j                  |j                  ||       d {    K7 F7 6 |t	        d      |S wr   )r   r   r   rV   r\   r   s	            r1   _achat_stream_with_aggregationz)ChatOllama._achat_stream_with_aggregation   s      6:!:!:!:8T!TV!T 	 	+F{S&"'K5(K%66

# ' 7   	 "U CDDsA   A8A(A$A(A8A8!A8A&A8$A(&A8(A8c                      | j                   |f||| j                  d|}t        t        |j                        |j
                        }t        |g      S )  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")
                ])
        rA   r   r   r&   r(   generations)r   r   r   r   rV   r*   r   r<   ra   rA   r   rB   r   chat_generations          r1   	_generatezChatOllama._generate  sh    0 9d88
#LL	

 
 )k&6&67'77
 &788r3   c                    K    | j                   |f||| j                  d| d{   }t        t        |j                        |j
                        }t        |g      S 7 <w)r   r   Nr&   r(   r   )r   r   r   r   rV   r*   r   r   s          r1   
_ageneratezChatOllama._agenerate0  sw     0 @D??
#LL	

 
 
 )k&6&67'77
 &788
s   %A&A$=A&c              +     K   	  | j                   ||fi |D ]>  }|st        |      }|r(|j                  |j                  || j                         | @ y # t
        $ r   | j                  ||fi |E d {  7   Y y w xY wwNr   )r|   r   r   rV   r   r   _legacy_streamr<   ra   rA   r   rB   r   r   s          r1   _streamzChatOllama._streamU  s     	E7t77$Q&Q 	 J;WE"#44!JJ"'$(LL 5 
  K	  + 	E*t**8TDVDDD	Es9   BA ;A B B:A=;B BBBc                   K    | j                   ||fi |2 3 d {   }|st        |      }|r0|j                  |j                  || j                         d {    | O7 J7 6 y wr   )r   r   r   rV   r   r   s          r1   _astreamzChatOllama._astreamj  s      ";!:!:8T!TV!T 		 		+F{S%66

# $ 7   
 			 "Us<   A,A*A&A*A,8A,A(
A,&A*(A,*A,r   c              +      K   | j                  |      } | j                  ||fi |D ]>  }|st        |      }|r(|j                  |j                  || j
                         | @ y wr   )re   _create_generate_streamr2   r   rV   r   )r<   ra   rA   r   rB   promptr   r   s           r1   r   zChatOllama._legacy_stream|  sv      ..x87477OO 		KA+N00

# $ 1 
 		s
   +A*<A*)N)NNF)NN)%__name__
__module____qualname____doc__propertyrm   r=   classmethodboolr@   r   r   r   r   rR   r   r   r`   re   r   r	   rS   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   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   rm   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   