o
    ZhY9                     @   s   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de defddZ!de defdd
Z"eddddG d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                 C   s:   t | }|ddu r|nd}tt|ddd|dS )0Convert a stream response to a generation chunk.doneTNresponse contentmessagegeneration_infojsonloadsgetr   r   r   Zparsed_responser(    r.   ]/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/ollama.py)_stream_response_to_chat_generation_chunk   s   
r0   c                 C   sB   t | }|ddu r|nd}tt|di ddd|dS )	r    r!   TNr'   r%   r#   r$   r&   r)   r-   r.   r.   r/   r   $   s   
z0.3.1z1.0.0zlangchain_ollama.ChatOllama)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		d-de
ee  d	edefd
dZeddddedefddZdee defddZdee deeeeeee f f  fddZ	d-dee de
ee  d	edee fddZ	d-dee de
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defddZ			d.dee de
ee  de
e ded	ed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/dee de
ee  de
e d	edef
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e f
d(d)Z#edd*d		d/dee de
ee  de
e d	edee f
d+d,Z$dS )0
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                 C      dS )zReturn type of chat model.zollama-chatr.   selfr.   r.   r/   	_llm_typeC      zChatOllama._llm_typec                 C   r2   )z9Return whether this model can be serialized by Langchain.Fr.   )clsr.   r.   r/   is_lc_serializableH   r6   zChatOllama.is_lc_serializableNstopkwargsc                 K   sp   | j d
d|i|}td| jd|d| jd}|d| j }r%||d< |p/|ddp/| j }r6||d	< |S )z Get standard params for tracing.r9   ZollamaZchattemperature)Zls_providerZls_model_nameZls_model_typeZls_temperaturenum_predictls_max_tokensNls_stopr.   )Z_get_invocation_paramsr   modelr,   r;   r<   r9   )r4   r9   r:   paramsZ	ls_paramsr=   r>   r.   r.   r/   _get_ls_paramsM   s   zChatOllama._get_ls_paramsr   $_convert_messages_to_ollama_messagesr   r'   c                 C   s   t |trd|j  d|j }|S t |trPt |jtrGttt |jd }|	d}|dkr;d|d  d}|S |dkrE|d d	 }|S d|j d}|S t |t
r[|j }|S t |trid
|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)r4   r'   message_textZfirst_contentcontent_typer.   r.   r/   _format_message_as_text^   s,   


	

z"ChatOllama._format_message_as_textmessagesc                    s   d  fdd|D S )N
c                    s   g | ]}  |qS r.   )rM   ).0r'   r3   r.   r/   
<listcomp>v   s    z7ChatOllama._format_messages_as_text.<locals>.<listcomp>)join)r4   rN   r.   r3   r/   _format_messages_as_textt   s   z#ChatOllama._format_messages_as_textc                 C   sD  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r2|j}ndttt	 |jD ][}|
ddkrM|d|d  7 }q:|
dd	krd }|
d	}	t |	tre|d	 }nt |	trsd
|	v rs|	d
 }ntd|d}
t|
dkr||
d  q:||
d  q:td||||d q|S )Nr#   userZ	assistantsystemz-Received unsupported message type for Ollama.rC   rD   rO   rE   rF   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.)rH   r%   images)rG   r   r   r   rJ   r%   strr	   r   r   r,   dictsplitlenappend)r4   rN   Zollama_messagesr'   rH   r%   rX   Zcontent_partrE   Ztemp_image_urlZimage_url_componentsr.   r.   r/   rB   y   sV   







z/ChatOllama._convert_messages_to_ollama_messagesc                 k   s>    | j | |d}| jd||| j dd|E d H  d S N)r?   rN   z	/api/chat)payloadr9   Zapi_urlr.   )r?   rB   Z_create_streambase_url)r4   rN   r9   r:   r_   r.   r.   r/   _create_chat_stream   s   zChatOllama._create_chat_streamc                 K  sN   | j | |d}| jd||| j dd|2 z	3 d H W }|V  q6 d S r^   )r?   rB   Z_acreate_streamr`   )r4   rN   r9   r:   r_   stream_respr.   r.   r/   _acreate_chat_stream   s   zChatOllama._acreate_chat_streamFrun_managerverbosec           	      K   sj   d }| j ||fi |D ]}|r*t|}|d u r|}n||7 }|r*|j|j||d q|d u r3td|S Nchunkre   z$No data received from Ollama stream.)ra   r   on_llm_new_tokenrD   rJ   	r4   rN   r9   rd   re   r:   final_chunkrb   rh   r.   r.   r/   _chat_stream_with_aggregation   s"   z(ChatOllama._chat_stream_with_aggregationc           	         s|   d }| j ||fi |2 z%3 d H W }|r2t|}|d u r |}n||7 }|r2|j|j||dI d H  q6 |d u r<td|S rf   )rc   r   ri   rD   rJ   rj   r.   r.   r/   _achat_stream_with_aggregation   s&    z)ChatOllama._achat_stream_with_aggregationc                 K   s>   | j |f||| jd|}tt|jd|jd}t|gd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")
                ])
        r9   rd   re   r$   r&   Zgenerations)rl   re   r   r   rD   r(   r   r4   rN   r9   rd   r:   rk   Zchat_generationr.   r.   r/   	_generate  s   
zChatOllama._generatec                    sF   | j |f||| jd|I dH }tt|jd|jd}t|gdS )rn   ro   Nr$   r&   rp   )rm   re   r   r   rD   r(   r   rq   r.   r.   r/   
_agenerate0  s   
zChatOllama._ageneratec                 k   s|    z%| j ||fi |D ]}|r#t|}|r |j|j|| jd |V  qW d S  ty=   | j||fi |E d H  Y d S w Nrg   )ra   r   ri   rD   re   r   _legacy_streamr4   rN   r9   rd   r:   rb   rh   r.   r.   r/   _streamU  s"   
 zChatOllama._streamc                 K  sZ   | j ||fi |2 z3 d H W }|r)t|}|r&|j|j|| jdI d H  |V  q6 d S rt   )rc   r   ri   rD   re   rv   r.   r.   r/   _astreamj  s    zChatOllama._astreamrw   c                 k   sT    |  |}| j||fi |D ]}|r't|}|r$|j|j|| jd |V  qd S rt   )rS   Z_create_generate_streamr0   ri   rD   re   )r4   rN   r9   rd   r:   promptrb   rh   r.   r.   r/   ru   |  s   
zChatOllama._legacy_stream)N)NNF)NN)%__name__
__module____qualname____doc__propertyrY   r5   classmethodboolr8   r   r   r   r   rA   r
   r   rM   rS   r   r   rB   r   ra   r   rc   r   r   rl   r   rm   r   rr   rs   rw   rx   ru   r.   r.   r.   r/   r1   2   s   



B









(

(





r1   )$r*   typingr   r   r   r   r   r   r   r	   Zlangchain_core._apir
   Zlangchain_core.callbacksr   r   Z*langchain_core.language_models.chat_modelsr   r   Zlangchain_core.messagesr   r   r   r   r   r   Zlangchain_core.outputsr   r   r   Zlangchain_community.llms.ollamar   r   rY   r0   r   r1   r.   r.   r.   r/   <module>   s2    ( 

