a
    pDf                     @  s   d Z ddlmZ ddlmZmZmZmZ z$ddlm	Z	 ddl
mZmZmZ W n" eyn   eZ	dZdZdZY n0 ddlmZ dd	lmZ dd
lmZ ddlmZ G dd de	ZdS )z=The langchain module integrates Langchain support with Panel.    )annotations)AnyDictListUnion)BaseCallbackHandler)AgentActionAgentFinish	LLMResultN   )ChatFeed)ChatInterface)DEFAULT_AVATARS)	Accordionc                      s  e Zd ZdZded fddddddZddd	d
dZdd Zdd ZddddZ	dd fddZ
ddd fddZdd fddZdd  fd!d"Zd#d$d$d% fd&d'Zd(d$d$d) fd*d+Zddd, fd-d.Zdd/ fd0d1Zdd  fd2d3Zddd4 fd5d6Zdd7 fd8d9Zdd$d$d: fd;d<Zd$d$d= fd>d?Zdd$d@ fdAdBZddCd$ddDdEdFZ  ZS )GPanelCallbackHandleran  
    The Langchain `PanelCallbackHandler` itself is not a widget or pane, but is useful for rendering
    and streaming the *chain of thought* from Langchain Tools, Agents, and Chains
    as `ChatMessage` objects.

    Reference: https://panel.holoviz.org/reference/chat/PanelCallbackHandler.html

    :Example:

    >>> chat_interface = pn.widgets.ChatInterface(callback=callback, callback_user="Langchain")
    >>> callback_handler = pn.widgets.langchain.PanelCallbackHandler(instance=chat_interface)
    >>> llm = ChatOpenAI(streaming=True, callbacks=[callback_handler])
    >>> chain = ConversationChain(llm=llm)

    Z	LangChainZ	langchainzChatFeed | ChatInterfacestr)instanceuseravatarc                 C  sH   t tu rtd|| _d | _|| _|| _| jj| _d | _	|| _
|| _d S )Nz>LangChainCallbackHandler requires `langchain` to be installed.)r   objectImportErrorr   _message_active_user_active_avatardisabled_disabled_state_is_streaming_input_user_input_avatar)selfr   r   r    r    a/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/chat/langchain.py__init__)   s    
zPanelCallbackHandler.__init__)r   labelc                 C  s8   |dkrdS || _ d| | jvr4| j d| | _dS )zP
        Prevent duplicate labels from being appended to the same user.
        NoneNz- z - )r   r   )r   r   r#   r    r    r!   _update_active=   s
    z#PanelCallbackHandler._update_activec                 C  s   | j | _| j| _d | _d S N)r   r   r   r   r   )r   r    r    r!   _reset_activeI   s    z"PanelCallbackHandler._reset_activec                 C  sn   | di  dd}| di  d| _| jj}|d j| jkrFd | _| jrj|| jvrj| j d| d| _d S )	NZinvocation_paramsZ
model_name kwargsZ	streamingz ())getr   r   objectsr   r   r   )r   
serializedr)   modelmessagesr    r    r!   	_on_startN   s    zPanelCallbackHandler._on_start)messagec                 C  s$   |r| j j|| j| j| jdS | jS )N)r   r   r2   )r   streamr   r   r   )r   r2   r    r    r!   _streamW   s    zPanelCallbackHandler._streamzDict[str, Any])r.   c                   s&   |  || t j|g|R i |S r&   )r1   superon_llm_start)r   r.   argsr)   	__class__r    r!   r6   a   s    z!PanelCallbackHandler.on_llm_startr$   )tokenreturnc                   s    |  || _t j|fi |S r&   )r4   r   r5   on_llm_new_token)r   r:   r)   r8   r    r!   r<   e   s    z%PanelCallbackHandler.on_llm_new_tokenr
   )responsec                   s>   | j s| |jd d j |   t j|g|R i |S )Nr   )r   r4   Zgenerationstextr'   r5   
on_llm_end)r   r=   r7   r)   r8   r    r!   r?   i   s    zPanelCallbackHandler.on_llm_endz#Union[Exception, KeyboardInterrupt])errorc                   s   t  j|g|R i |S r&   )r5   on_llm_errorr   r@   r7   r)   r8   r    r!   rA   q   s    z!PanelCallbackHandler.on_llm_errorr   r   )actionr)   r;   c                   s   t  j|g|R i |S r&   )r5   on_agent_action)r   rC   r7   r)   r8   r    r!   rD   t   s    z$PanelCallbackHandler.on_agent_actionr	   )finishr)   r;   c                   s   t  j|g|R i |S r&   )r5   on_agent_finish)r   rE   r7   r)   r8   r    r!   rF   w   s    z$PanelCallbackHandler.on_agent_finish)r.   	input_strc                   s@   |  td |d  | d|  t j||g|R i |S )NZtoolnamezTool input: )r%   r   r4   r5   on_tool_start)r   r.   rG   r7   r)   r8   r    r!   rI   z   s    z"PanelCallbackHandler.on_tool_start)outputc                   s,   |  | |   t j|g|R i |S r&   )r4   r'   r5   on_tool_end)r   rJ   r7   r)   r8   r    r!   rK      s    
z PanelCallbackHandler.on_tool_endc                   s   t  j|g|R i |S r&   )r5   on_tool_errorrB   r8   r    r!   rL      s    z"PanelCallbackHandler.on_tool_error)r.   inputsc                   s.   | j j| _d| j _t j||g|R i |S )NT)r   r   r   r5   on_chain_start)r   r.   rM   r7   r)   r8   r    r!   rN      s    
z#PanelCallbackHandler.on_chain_start)outputsc                   s$   | j | j_t j|g|R i |S r&   )r   r   r   r5   on_chain_end)r   rO   r7   r)   r8   r    r!   rP      s    
z!PanelCallbackHandler.on_chain_end)r@   r)   r;   c                   s   t  j|fi |S )zRun when Retriever errors.)r5   on_retriever_error)r   r@   r)   r8   r    r!   rQ      s    z'PanelCallbackHandler.on_retriever_error)r)   r;   c                   sP   dd t |D }t|ddd}| jj|dtd dd	 t jf d
|i|S )z Run when Retriever ends running.c                 S  s    g | ]\}}d | |j fqS )z	Document )Zpage_content).0indexdocumentr    r    r!   
<listcomp>       z9PanelCallbackHandler.on_retriever_end.<locals>.<listcomp>Zstretch_width)
      rW      )Zsizing_modemarginzLangChain (retriever)Z	retrieverF)r   r   Zrespond	documents)	enumerater   r   sendr   r5   on_retriever_end)r   r[   r)   r-   r2   r8   r    r!   r^      s    z%PanelCallbackHandler.on_retriever_end)r>   r)   c                   s   t  j|fi |S )zRun when text is received.)r5   on_text)r   r>   r)   r8   r    r!   r_      s    zPanelCallbackHandler.on_textr   )r.   r0   r)   r;   c                 K  s   |  || dS )zv
        To prevent the inherited class from raising
        NotImplementedError, will not call super() here.
        N)r1   )r   r.   r0   r)   r    r    r!   on_chat_model_start   s    
z(PanelCallbackHandler.on_chat_model_start)__name__
__module____qualname____doc__r   r"   r%   r'   r1   r4   r6   r<   r?   rA   rD   rF   rI   rK   rL   rN   rP   rQ   r^   r_   r`   __classcell__r    r    r8   r!   r      s.   	
r   )rd   
__future__r   typingr   r   r   r   Zlangchain.callbacks.baser   Zlangchain.schemar   r	   r
   r   r   Z	chat.feedr   Zchat.interfacer   Zchat.messager   Zlayoutr   r   r    r    r    r!   <module>   s   
