o
    Zh>%                     @   s   d dl Z d dlZd dl mZ d dlmZmZmZmZmZm	Z	 d dl
Z
d dlmZ d dlmZmZ d dlmZmZmZ d dlmZmZmZ d dlmZmZmZ d d	lmZ d d
lmZm Z m!Z! de"de"fddZ#dee dee"ef fddZ$G dd deZ%dS )    N)JSONDecodeError)AnyAsyncIteratorDictIteratorListOptional)ClientSession)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModelagenerate_from_streamgenerate_from_stream)	AIMessageAIMessageChunkBaseMessage)ChatGenerationChatGenerationChunk
ChatResult)convert_to_secret_str)
ConfigDictField	SecretStrrolereturnc                 C   s*   dddd}| |v r||  S t d|  )NZ	assistanthuman)Zair   ZchatzUnknown role type: )
ValueError)r   map r   e/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/symblai_nebula.py_convert_role   s   r    messagesc                 C   s|   d}g }| d d D ]!}|j dkrt|jtr|j}q
td|t|j |jd q
| d j}|d|d ||dS )N systemzSystem prompt must be a string)r   textr   )Zsystem_promptr!   )type
isinstancecontentstrr   appendr    )r!   r$   Zformatted_messagesmessager%   r   r   r   _format_nebula_messages   s   


r,   c                       s  e Zd ZU dZdZeed< 	 dZee	 ed< 	 dZ
eed< dZeed	< ed
ddZee ed< edddZdedd
f fddZedefddZ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 	
	
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#  Z$S )$
ChatNebulaam  `Nebula` chat large language model - https://docs.symbl.ai/docs/nebula-llm

    API Reference: https://docs.symbl.ai/reference/nebula-chat

    To use, set the environment variable ``NEBULA_API_KEY``,
    or pass it as a named parameter to the constructor.
    To request an API key, visit https://platform.symbl.ai/#/login
    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatNebula
            from langchain_core.messages import SystemMessage, HumanMessage

            chat = ChatNebula(max_new_tokens=1024, temperature=0.5)

            messages = [
            SystemMessage(
                content="You are a helpful assistant."
            ),
            HumanMessage(
                "Answer the following question. How can I help save the world."
            ),
            ]
            chat.invoke(messages)
    i   max_new_tokensr   temperatureF	streamingzhttps://api-nebula.symbl.ainebula_api_urlNzNebula API Token)descriptionnebula_api_keyT)Zpopulate_by_nameZarbitrary_types_allowedkwargsr   c                    sP   d|v rt |d}ndtjv rt tjd }nd }t jdd|i| d S )Nr3   ZNEBULA_API_KEYr   )r   poposenvironsuper__init__)selfr4   Zapi_key	__class__r   r   r9   a   s   
zChatNebula.__init__c                 C   s   dS )zReturn type of chat model.znebula-chatr   r:   r   r   r   	_llm_typej   s   zChatNebula._llm_typec                 C   s   | j r| j  S dS )Nr"   )r3   Zget_secret_valuer=   r   r   r   _api_keyo   s   
zChatNebula._api_keyr!   stoprun_managerc              	   k   s    | j  d}| jdd}t|d}| j| jd||}dd | D }t|}	tj	d|||	d	d
}
|

  |
 D ]3}| dd }zt|}W n	 tyW   Y q=w |d }tt|dd}|rm|j||d |V  q=dS )z#Call out to Nebula's chat endpoint./v1/model/chat/streamingapplication/jsonZApiKeyzContent-Typer!   r.   r/   c                 S      i | ]\}}|d ur||qS Nr   .0kvr   r   r   
<dictcomp>       z&ChatNebula._stream.<locals>.<dictcomp>POSTT)headersdatastream   Ndeltar(   r+   chunk)r1   r?   r,   r.   r/   itemsjsondumpsrequestsrequestraise_for_status
iter_linesdecodeloadsr   r   r   on_llm_new_token)r:   r!   r@   rA   r4   urlrP   formatted_datapayloadjson_payloadresponsechunk_responsechunk_decodedrX   tokencg_chunkr   r   r   _streamu   s@   


zChatNebula._streamc                 K  sb  | j  d}| jdd}t|d}| j| jd||}dd | D }t|}	t 4 I d H r}
|
j	||	|dd	4 I d H N}|
  |j2 z:3 d H W }| d
d  }zt|}W n	 tyf   Y qHw |d }tt|dd}|r|j||dI d H  |V  qH6 W d   I d H  n1 I d H sw   Y  W d   I d H  d S 1 I d H sw   Y  d S )NrB   rC   rD   rE   rF   c                 S   rG   rH   r   rI   r   r   r   rM      rN   z'ChatNebula._astream.<locals>.<dictcomp>T)rQ   rP   rR   rS   rT   rU   rV   rW   )r1   r?   r,   r.   r/   rY   rZ   r[   r	   postr^   r(   r`   ra   r   r   r   rb   )r:   r!   r@   rA   r4   rc   rP   rd   re   rf   sessionrg   rh   ri   rX   rj   rk   r   r   r   _astream   sH   

*.zChatNebula._astreamc                 K   s   | j r| j|f||d|}t|S | j d}| jdd}t|d}| j| jd||}	dd |	 D }	t	
|	}
tjd	|||
d
}|  |	 }ttt|d ddg|dS )Nr@   rA   /v1/model/chatrC   rD   rE   rF   c                 S   rG   rH   r   rI   r   r   r   rM      rN   z(ChatNebula._generate.<locals>.<dictcomp>rO   )rP   rQ   r!   rU   rV   ZgenerationsZ
llm_output)r0   rl   r   r1   r?   r,   r.   r/   rY   rZ   r[   r\   r]   r^   r   r   r   )r:   r!   r@   rA   r4   stream_iterrc   rP   rd   re   rf   rg   rQ   r   r   r   	_generate   s8   

zChatNebula._generatec              
      sN  | j r| j|f||d|}t|I d H S | j d}| jdd}t|d}| j| jd||}	dd |	 D }	t	
|	}
t 4 I d H R}|j||
|d	4 I d H /}|  |	 I d H }ttt|d
 ddg|dW  d   I d H  W  d   I d H  S 1 I d H sw   Y  W d   I d H  d S 1 I d H sw   Y  d S )Nrp   rq   rC   rD   rE   rF   c                 S   rG   rH   r   rI   r   r   r   rM      rN   z)ChatNebula._agenerate.<locals>.<dictcomp>)rQ   rP   r!   rU   rV   rr   )r0   ro   r   r1   r?   r,   r.   r/   rY   rZ   r[   r	   rm   r^   r   r   r   )r:   r!   r@   rA   r4   rs   rc   rP   rd   re   rf   rn   rg   rQ   r   r   r   
_agenerate   sL   

.zChatNebula._agenerate)NN)%__name__
__module____qualname____doc__r.   int__annotations__r/   r   floatr0   boolr1   r)   r   r3   r   r   Zmodel_configr   r9   propertyr>   r?   r   r   r   r   r   rl   r
   r   ro   r   rt   ru   __classcell__r   r   r;   r   r-   5   s   
 	

,

*

&
r-   )&rZ   r6   r   typingr   r   r   r   r   r   r\   Zaiohttpr	   Zlangchain_core.callbacksr
   r   Z*langchain_core.language_models.chat_modelsr   r   r   Zlangchain_core.messagesr   r   r   Zlangchain_core.outputsr   r   r   Zlangchain_core.utilsr   Zpydanticr   r   r   r)   r    r,   r-   r   r   r   r   <module>   s     