
    e                        d Z ddlmZ ddlmZmZmZmZ 	 ddlm	Z	 ddl
mZmZmZ n# e$ r eZ	dZdZdZY nw xY wddlmZ dd	lmZ dd
lmZ ddlmZ  G 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                       e Zd ZdZded         fd5d	Zd6dZd Zd Zd7dZ	d8 fdZ
d9 fdZd: fdZd; fdZd< fd!Zd= fd$Zd> fd&Zd? fd(Zd; fd)Zd@ fd+ZdA fd-ZdB fd.ZdC fd/ZdD fd1ZdEd4Z xZS )F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)

    	LangChain	langchaininstanceChatFeed | ChatInterfaceuserstravatarc                    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   s       4lib/python3.11/site-packages/panel/chat/langchain.py__init__zPanelCallbackHandler.__init__)   so     &((P   ! $#}5!#    labelc                b    |dk    rdS || _         d| | j        vr| j         d| | _        dS dS )zP
        Prevent duplicate labels from being appended to the same user.
        NoneNz- z - )r   r   )r%   r   r)   s      r&   _update_activez#PanelCallbackHandler._update_active=   sU    
 F??F$<<t000#'#4 @ @ @ @D 10r(   c                D    | j         | _        | j        | _        d | _        d S N)r#   r   r$   r   r   )r%   s    r&   _reset_activez"PanelCallbackHandler._reset_activeI   s#     ,"0r(   c                T   |                     di                                dd          }|                     di                                d          | _        | j        j        }|d         j        | j        k    rd | _        | j        r|| j        vr| j         d| d| _        d S d S d S )	Ninvocation_params
model_name kwargs	streamingz ())getr"   r   objectsr   r   r   )r%   
serializedr4   modelmessagess        r&   	_on_startzPanelCallbackHandler._on_startN   s    

.3377bII'^^Hb99==kJJ=(B< 111 DM 	Ad.?!?!?#'#4 @ @ @ @ @D	A 	A!?!?r(   messagec                n    |r-| j                             || j        | j        | j                  S | j        S )N)r   r   r>   )r   streamr   r   r   )r%   r>   s     r&   _streamzPanelCallbackHandler._streamW   sG     	=''&*	 (    }r(   r:   Dict[str, Any]c                j    |                      ||            t                      j        |g|R i |S r.   )r=   superon_llm_start)r%   r:   argsr4   	__class__s       r&   rE   z!PanelCallbackHandler.on_llm_starta   s>    z6***#uww#J@@@@@@@r(   tokenreturnr+   c                l    |                      |          | _         t                      j        |fi |S r.   )rA   r   rD   on_llm_new_token)r%   rH   r4   rG   s      r&   rK   z%PanelCallbackHandler.on_llm_new_tokene   s5    U++'uww'88888r(   responser   c                    | j         s+|                     |j        d         d         j                   |                                   t                      j        |g|R i |S )Nr   )r"   rA   generationstextr/   rD   
on_llm_end)r%   rL   rF   r4   rG   s       r&   rP   zPanelCallbackHandler.on_llm_endi   si    ! 	:LL-a038999!uww!(<T<<<V<<<r(   error#Union[Exception, KeyboardInterrupt]c                >     t                      j        |g|R i |S r.   )rD   on_llm_errorr%   rQ   rF   r4   rG   s       r&   rT   z!PanelCallbackHandler.on_llm_errorq   s*    #uww#E;D;;;F;;;r(   actionr	   r4   r   c                >     t                      j        |g|R i |S r.   )rD   on_agent_action)r%   rV   rF   r4   rG   s       r&   rX   z$PanelCallbackHandler.on_agent_actiont   *    &uww&v???????r(   finishr
   c                >     t                      j        |g|R i |S r.   )rD   on_agent_finish)r%   rZ   rF   r4   rG   s       r&   r\   z$PanelCallbackHandler.on_agent_finishw   rY   r(   	input_strc                    |                      t          d         |d                    |                     d|             t                      j        ||g|R i |S )NtoolnamezTool input: )r,   r   rA   rD   on_tool_start)r%   r:   r]   rF   r4   rG   s        r&   ra   z"PanelCallbackHandler.on_tool_startz   si     	OF3Z5GHHH/I//000$uww$ZLTLLLVLLLr(   outputc                    |                      |           |                                   t                      j        |g|R i |S r.   )rA   r/   rD   on_tool_end)r%   rb   rF   r4   rG   s       r&   rd   z PanelCallbackHandler.on_tool_end   sN    V"uww"6;D;;;F;;;r(   c                >     t                      j        |g|R i |S r.   )rD   on_tool_errorrU   s       r&   rf   z"PanelCallbackHandler.on_tool_error   s,     %uww$U<T<<<V<<<r(   inputsc                z    | j         j        | _        d| j         _         t                      j        ||g|R i |S )NT)r   r    r!   rD   on_chain_start)r%   r:   rg   rF   r4   rG   s        r&   ri   z#PanelCallbackHandler.on_chain_start   sE      $}5!%%uww%j&J4JJJ6JJJr(   outputsc                `    | j         | j        _         t                      j        |g|R i |S r.   )r!   r   r    rD   on_chain_end)r%   rj   rF   r4   rG   s       r&   rl   z!PanelCallbackHandler.on_chain_end   s7    !%!5#uww#G=d===f===r(   c                8     t                      j        |fi |S )zRun when Retriever errors.)rD   on_retriever_error)r%   rQ   r4   rG   s      r&   rn   z'PanelCallbackHandler.on_retriever_error   s$     *uww)%::6:::r(   c                    d t          |          D             }t          |ddd}| j                            |dt          d         d            t                      j        d
d	|i|S )z Run when Retriever ends running.c                ,    g | ]\  }}d | |j         fS )z	Document )page_content).0indexdocuments      r&   
<listcomp>z9PanelCallbackHandler.on_retriever_end.<locals>.<listcomp>   s-    lllOE8''')>?lllr(   stretch_width)
      rw      )sizing_modemarginzLangChain (retriever)	retrieverF)r   r   respond	documents )	enumerater   r   sendr   rD   on_retriever_end)r%   r~   r4   r9   r>   rG   s        r&   r   z%PanelCallbackHandler.on_retriever_end   s    llW`ajWkWklllW/,WWW(";/	 	 	
 	
 	
 (uww'FF)FvFFFr(   rO   c                8     t                      j        |fi |S )zRun when text is received.)rD   on_text)r%   rO   r4   rG   s      r&   r   zPanelCallbackHandler.on_text   s!    uwwt..v...r(   r<   r   c                2    |                      ||           dS )zv
        To prevent the inherited class from raising
        NotImplementedError, will not call super() here.
        N)r=   )r%   r:   r<   r4   s       r&   on_chat_model_startz(PanelCallbackHandler.on_chat_model_start   s     	z6*****r(   )r   r   r   r   r   r   )r   r   r)   r   )r>   r   )r:   rB   )rH   r   rI   r+   )rL   r   )rQ   rR   )rV   r	   r4   r   rI   r   )rZ   r
   r4   r   rI   r   )r:   rB   r]   r   )rb   r   )r:   rB   rg   rB   )rj   rB   )rQ   rR   r4   r   rI   r   )r4   r   rI   r   )rO   r   r4   r   )r:   rB   r<   r   r4   r   rI   r+   )__name__
__module____qualname____doc__r   r'   r,   r/   r=   rA   rE   rK   rP   rT   rX   r\   ra   rd   rf   ri   rl   rn   r   r   r   __classcell__)rG   s   @r&   r   r      sx        &  %k2	$ $ $ $ $(
A 
A 
A 
A  
A A A   A A A A A A9 9 9 9 9 9= = = = = =< < < < < <@ @ @ @ @ @@ @ @ @ @ @M M M M M M< < < < < <
= = = = = =
K K K K K K> > > > > >; ; ; ; ; ;
G 
G 
G 
G 
G 
G/ / / / / /
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+r(   r   )r   
__future__r   typingr   r   r   r   langchain.callbacks.baser   langchain.schemar	   r
   r   r   r   	chat.feedr   chat.interfacer   chat.messager   layoutr   r   r   r(   r&   <module>r      sN   C C " " " " " "           <<<<<<DDDDDDDDDDD    KKIII	 !           * * * * * * * * * * * *      ^+ ^+ ^+ ^+ ^+. ^+ ^+ ^+ ^+ ^+s   ' 77