a
    bgY9                     @   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e edddZ!e ed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.   t/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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edddZeedddZ	d-e
ee  eedd	d
ZedddeedddZee edddZee eeeeeee f f  dddZd.ee e
ee  eee dddZd/ee e
ee  eee dddZd0ee e
ee  e
e eeedddZd1ee e
ee  e
e eeeddd Zd2ee e
ee  e
e eed!d"d#Z d3ee e
ee  e
e eed!d$d%Z!d4ee e
ee  e
e eee d!d&d'Z"d5ee e
ee  e
e eee d!d(d)Z#edd*dd6ee e
ee  e
e eee d!d+d,Z$dS )7
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   s   dS )zReturn type of chat model.zollama-chatr.   selfr.   r.   r/   	_llm_typeC   s    zChatOllama._llm_typec                 C   s   dS )z9Return whether this model can be serialized by Langchain.Fr.   )clsr.   r.   r/   is_lc_serializableH   s    zChatOllama.is_lc_serializableN)stopkwargsr   c                 K   sp   | j f d|i|}td| jd|d| jd}|d| j }rJ||d< |p^|ddp^| j }rl||d	< |S )
z Get standard params for tracing.r7   ZollamaZchattemperature)Zls_providerZls_model_nameZls_model_typeZls_temperaturenum_predictls_max_tokensNls_stop)Z_get_invocation_paramsr   modelr,   r9   r:   r7   )r3   r7   r8   paramsZ	ls_paramsr;   r<   r.   r.   r/   _get_ls_paramsM   s    zChatOllama._get_ls_paramsr   $_convert_messages_to_ollama_messagesr   )r'   r   c                 C   s   t |tr$d|j  d|j }nt |trt |jtrttt |jd }|	d}|dkrrd|d  d}q|dkr|d d	 }qd|j d}n<t |t
r|j }n(t |trd
|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)r3   r'   message_textZfirst_contentcontent_typer.   r.   r/   _format_message_as_text^   s"    





z"ChatOllama._format_message_as_text)messagesr   c                    s   d  fdd|D S )N
c                    s   g | ]}  |qS r.   )rK   ).0r'   r2   r.   r/   
<listcomp>v       z7ChatOllama._format_messages_as_text.<locals>.<listcomp>)join)r3   rL   r.   r2   r/   _format_messages_as_textt   s    z#ChatOllama._format_messages_as_textc                 C   sL  g }|D ]<}d}t |tr"d}n(t |tr2d}nt |trBd}ntdd}g }t |jtrf|j}nttt	 |jD ]}|
ddkr|d|d  7 }qv|
dd	kr*d }|
d	}	t |	tr|d	 }n$t |	trd
|	v r|	d
 }ntd|d}
t|
dkr||
d  n||
d  qvtdqv||||d q|S )Nr#   userZ	assistantsystemz-Received unsupported message type for Ollama.rA   rB   rM   rC   rD   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.)rF   r%   images)rE   r   r   r   rH   r%   strr	   r   r   r,   dictsplitlenappend)r3   rL   Zollama_messagesr'   rF   r%   rW   Zcontent_partrC   Ztemp_image_urlZimage_url_componentsr.   r.   r/   r@   y   sX    








z/ChatOllama._convert_messages_to_ollama_messages)rL   r7   r8   r   c                 k   s<   | j | |d}| jf ||| j dd|E d H  d S N)r=   rL   z	/api/chat)payloadr7   Zapi_url)r=   r@   Z_create_streambase_url)r3   rL   r7   r8   r^   r.   r.   r/   _create_chat_stream   s    zChatOllama._create_chat_streamc                 K  sL   | j | |d}| jf ||| j dd|2 z3 d H W }|V  q26 d S r]   )r=   r@   Z_acreate_streamr_   )r3   rL   r7   r8   r^   stream_respr.   r.   r/   _acreate_chat_stream   s    zChatOllama._acreate_chat_streamF)rL   r7   run_managerverboser8   r   c           	      K   sj   d }| j ||fi |D ]<}|rt|}|d u r6|}n||7 }|r|j|j||d q|d u rftd|S Nchunkrd   z$No data received from Ollama stream.)r`   r   on_llm_new_tokenrB   rH   	r3   rL   r7   rc   rd   r8   final_chunkra   rg   r.   r.   r/   _chat_stream_with_aggregation   s     z(ChatOllama._chat_stream_with_aggregationc           	         sz   d }| j ||fi |2 zJ3 d H W }|rt|}|d u r>|}n||7 }|r|j|j||dI d H  q6 |d u rvtd|S re   )rb   r   rh   rB   rH   ri   r.   r.   r/   _achat_stream_with_aggregation   s      z)ChatOllama._achat_stream_with_aggregation)rL   r7   rc   r8   r   c                 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")
                ])
        r7   rc   rd   r$   r&   Zgenerations)rk   rd   r   r   rB   r(   r   r3   rL   r7   rc   r8   rj   Zchat_generationr.   r.   r/   	_generate  s    
zChatOllama._generatec                    sD   | j |f||| jd|I dH }tt|jd|jd}t|gdS )rm   rn   Nr$   r&   ro   )rl   rd   r   r   rB   r(   r   rp   r.   r.   r/   
_agenerate0  s    
zChatOllama._ageneratec                 k   sz   zH| j ||fi |D ].}|rt|}|r>|j|j|| jd |V  qW n, tyt   | j||fi |E d H  Y n0 d S Nrf   )r`   r   rh   rB   rd   r   _legacy_streamr3   rL   r7   rc   r8   ra   rg   r.   r.   r/   _streamU  s    zChatOllama._streamc                 K  sX   | j ||fi |2 z<3 d H W }|rt|}|rJ|j|j|| jdI d H  |V  q6 d S rs   )rb   r   rh   rB   rd   ru   r.   r.   r/   _astreamj  s     zChatOllama._astreamrv   c                 k   sR   |  |}| j||fi |D ].}|rt|}|rF|j|j|| jd |V  qd S rs   )rR   Z_create_generate_streamr0   rh   rB   rd   )r3   rL   r7   rc   r8   promptra   rg   r.   r.   r/   rt   |  s    
zChatOllama._legacy_stream)N)N)N)NNF)NNF)NN)NN)NN)NN)NN)%__name__
__module____qualname____doc__propertyrX   r4   classmethodboolr6   r   r   r   r   r?   r
   r   rK   rR   r   r   r@   r   r`   r   rb   r   r   rk   r   rl   r   rq   rr   rv   rw   rt   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   rX   r0   r   r1   r.   r.   r.   r/   <module>   s(   ( 
