
    NgY9                     2   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#dS )    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        |           }|                    d          du r|nd}t          t	          |                    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      b/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/ollama.py)_stream_response_to_chat_generation_chunkr2      sm    
 j11O)8)<)<V)D)D)L)LooRVO':'::r'J'JKKK'       c                     t          j        |           }|                    d          du r|nd}t          t	          |                    di                               dd                    |          S )	r"   r#   TNr)   r'   r%   r&   r(   r+   r/   s      r1   r   r   $   s     j11O)8)<)<V)D)D)L)LooRVO#''	266::9bII
 
 
 (	   r3   z0.3.1z1.0.0zlangchain_ollama.ChatOllama)sinceremovalalternative_importc                   L   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$dS )!
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                     dS )zReturn type of chat model.zollama-chat )selfs    r1   	_llm_typezChatOllama._llm_typeC   s	     }r3   c                     dS )z9Return whether this model can be serialized by Langchain.Fr;   )clss    r1   is_lc_serializablezChatOllama.is_lc_serializableH   s	     ur3   Nstopkwargsc           	          | j         d
d|i|}t          d| j        d|                    d| j                            }|                    d| j                  x}r||d<   |p|                    dd          p| 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&AA# * !::mT5EFF	
 
 
	 #JJ}d6FGGG= 	7)6Io&Cfjj66C$)C7 	+#*Ii r3   r   $_convert_messages_to_ollama_messagesr   r)   c                 b   t          |t                    r%d|j                                         d|j         }nt          |t
                    rt          |j        t                    rht          t          t                   |j                  d         }|	                    d          }|dk    rd|d          d}nr|dk    r|d         d	         }n]d|j         d}nQt          |t                    r	|j         }n3t          |t                    rd
|j         d}nt          d|           |S )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^   sA   g{++ 	<P',"9"9";";PPwPPLL.. 	<'/400 C $T$Z A A! D,00886))#L]6-B#L#L#LLL![00#0#=e#DLBBBB++ 	<%o/LL// 	<@go@@@LL:::;;;r3   messagesc                 F     d                      fd|D                       S )N
c                 :    g | ]}                     |          S r;   )r`   ).0r)   r<   s     r1   
<listcomp>z7ChatOllama._format_messages_as_text.<locals>.<listcomp>v   s'    KKKwT))'22KKKr3   )join)r<   ra   s   ` r1   _format_messages_as_textz#ChatOllama._format_messages_as_textt   s0    yyKKKK(KKK
 
 	
r3   c                    g }|D ]}d}t          |t                    rd}n?t          |t                    rd}n't          |t                    rd}nt	          d          d}g }t          |j        t                    r	|j        }n?t          t          t                   |j                  D ]}|
                    d          dk    r|d|d          z  }+|
                    d          d	k    rd }|
                    d	          }	t          |	t                    r	|d	         }n1t          |	t                    rd
|	v r	|	d
         }nt	          d          |                    d          }
t          |
          dk    r|                    |
d                    |                    |
d                    t	          d          |                    |||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'   ro   content_partrW   temp_image_urlimage_url_componentss              r1   rS   z/ChatOllama._convert_messages_to_ollama_messagesy   s6    !# 7	 7	GD'<00 RGY// R"G]33 R !PQQQGF'/3// "!/$(dW_$E$E  L#''//699#>V(<#>#>>%))&11[@@$(	)5)9)9+)F)F%nc:: 
(4[(AII&~t<<AF.AXAX(6u(=II",!F# # 
 09s/C/C, 344q88"MM*>q*ABBBB"MM*>q*ABBBB )?   "" &$     r3   c              +      K   | j         |                     |          d} | j        d||| j         dd|E d {V  d S N)rO   ra   z	/api/chat)payloadrA   api_urlr;   )rO   rS   _create_streambase_url)r<   ra   rA   rB   r{   s        r1   _create_chat_streamzChatOllama._create_chat_stream   s       ZAA(KK
 
 '4& 
$4=0K0K0K
 
OU
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r3   c                   K   | j         |                     |          d} | j        d||| j         dd|2 3 d {V }|W V  6 d S rz   )rO   rS   _acreate_streamr~   )r<   ra   rA   rB   r{   stream_resps         r1   _acreate_chat_streamzChatOllama._acreate_chat_stream   s       ZAA(KK
 
 "6!5 "
$4=0K0K0K"
 "
OU"
 "
 	 	 	 	 	 	 	+ "
 "
 "
s   AFrun_managerverbosec                     d } | j         ||fi |D ]<}|r8t          |          }||}n||z  }|r|                    |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3HdMMfMM 	 	K F{SS&"'KK5(K 00
# ' 1   
 CDDDr3   c                    K   d } | j         ||fi |2 3 d {V }|r>t          |          }||}n||z  }|r#|                    |j        ||           d {V  H6 |t	          d          |S r   )r   r   r   rV   r\   r   s	            r1   _achat_stream_with_aggregationz)ChatOllama._achat_stream_with_aggregation   s       6:!:!:8T!T!TV!T!T 	 	 	 	 	 	 	+ F{SS&"'KK5(K %66
# ' 7          "U CDDDs   A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  s}    0 9d8
#L	
 

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

 
 
 
 
 
 
 
 
 )k&6777'7
 
 
 &78888r3   c              +      K   	  | j         ||fi |D ];}|r7t          |          }|r"|                    |j        || j                   |V  <d S # t
          $ r  | j        ||fi |E d {V  Y d S w xY 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$QQ&QQ 	  	   J;WWE" #44!J"'$(L 5   
  KKK	  	  + 	E 	E 	E*t*8TDDVDDDDDDDDDDDD	Es   AA A43A4c                   K    | j         ||fi |2 3 d {V }|r>t          |          }|r(|                    |j        || j                   d {V  |W V  H6 d S r   )r   r   r   rV   r   r   s          r1   _astreamzChatOllama._astreamj  s       ";!:8T!T!TV!T!T 		 		 		 		 		 		 		+ F{SS %66
# $ 7         
  "U!T!Ts   Ar   c              +      K   |                      |          } | j        ||fi |D ];}|r7t          |          }|r"|                    |j        || j                   |V  <d S r   )rh   _create_generate_streamr2   r   rV   r   )r<   ra   rA   r   rB   promptr   r   s           r1   r   zChatOllama._legacy_stream|  s       ..x88747OOOO 		 		K A+NN 00
# $ 1   
 		 		r3   )N)NNF)NN)%__name__
__module____qualname____doc__propertyrp   r=   classmethodboolr@   r   r   r   r   rR   r   r   r`   rh   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    X 4    [
 +/ T#Y':=	   " Z%KLLL{ s    ML*
k1B 
s 
 
 
 

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

 
#
 
 
 
" %) {# tCy! 	
 
s	   $ %):> {# tCy! 67	
   
   < %)?C {# tCy! ;<	
   
   < %):>	#9 #9{##9 tCy!#9 67	#9
 #9 
#9 #9 #9 #9P %)?C	#9 #9{##9 tCy!#9 ;<	#9
 #9 
#9 #9 #9 #9P %):>	E E{#E tCy!E 67	E
 E 
%	&E E E E0 %)?C	 {# tCy! ;<	
  
*	+   $ Z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   rp   r2   r   r9   r;   r3   r1   <module>r      s    R R R R R R R R R R R R R R R R R R R R * * * * * *        V U U U U U U U                S R R R R R R R R R V V V V V V V V G!QRRR			 	 	 SR	    
4  
W W W W W W W 
W W Wr3   