
    }h                     R    d Z ddlZddlmZmZmZmZ ddlmZ g dZ	 G d de      Z
y)z4Callback Handler streams to stdout on new llm token.    N)AnyDictListOptional)StreamingStdOutCallbackHandler)FinalAnswer:c            	            e Zd ZdZdeddfdZdefdZdddd	d
ee	e      dededdf fdZ
deeef   de	e   deddfdZdededdfdZ xZS )#FinalStreamingStdOutCallbackHandlerzCallback handler for streaming in agents.
    Only works with agents using LLMs that support streaming.

    Only the final output of the agent will be streamed.
    tokenreturnNc                 P   | j                   j                  |       | j                  j                  |j                                t	        | j                         t	        | j
                        kD  r7| j                   j                  d       | j                  j                  d       y y )Nr   )last_tokensappendlast_tokens_strippedstriplenanswer_prefix_tokenspop)selfr   s     i/var/www/html/engine/venv/lib/python3.12/site-packages/langchain/callbacks/streaming_stdout_final_only.pyappend_to_last_tokensz9FinalStreamingStdOutCallbackHandler.append_to_last_tokens   s|    &!!((7t 3t'@'@#AA  #%%))!, B    c                 ~    | j                   r| j                  | j                  k(  S | j                  | j                  k(  S )N)strip_tokensr   answer_prefix_tokens_strippedr   r   )r   s    r   check_if_answer_reachedz;FinalStreamingStdOutCallbackHandler.check_if_answer_reached   s9    ,,0R0RRR##t'@'@@@r   TF)r   r   stream_prefixr   r   r   c                z   t         |           |t        | _        n|| _        |r.| j                  D cg c]  }|j	                          c}| _        n| j                  | _        dgt        | j                        z  | _        dgt        | j                        z  | _        || _	        || _
        d| _        yc c}w )a  Instantiate FinalStreamingStdOutCallbackHandler.

        Args:
            answer_prefix_tokens: Token sequence that prefixes the answer.
                Default is ["Final", "Answer", ":"]
            strip_tokens: Ignore white spaces and new lines when comparing
                answer_prefix_tokens to last tokens? (to determine if answer has been
                reached)
            stream_prefix: Should answer prefix itself also be streamed?
        N F)super__init__DEFAULT_ANSWER_PREFIX_TOKENSr   r   r   r   r   r   r   r   answer_reached)r   r   r   r   r   	__class__s        r   r#   z,FinalStreamingStdOutCallbackHandler.__init__   s    " 	'(DD%(<D%+/+D+D2"'2D. 261J1JD.4#d&?&?"@@%'D3t/H/H+I$I!(*#2s   B8
serializedpromptskwargsc                     d| _         y)zRun when LLM starts running.FN)r%   )r   r'   r(   r)   s       r   on_llm_startz0FinalStreamingStdOutCallbackHandler.on_llm_startA   s     $r   c                    | j                  |       | j                         rbd| _        | j                  rN| j                  D ]!  }t
        j                  j                  |       # t
        j                  j                          y| j                  r>t
        j                  j                  |       t
        j                  j                          yy)z?Run on new LLM token. Only available when streaming is enabled.TN)	r   r   r%   r   r   sysstdoutwriteflush)r   r   r)   ts       r   on_llm_new_tokenz4FinalStreamingStdOutCallbackHandler.on_llm_new_tokenG   s     	""5) '')"&D!!)) (AJJ$$Q'(

  " JJU#JJ r   )__name__
__module____qualname____doc__strr   boolr   r   r   r#   r   r   r+   r2   __classcell__)r&   s   @r   r   r      s    -3 -4 -A A 59!# $ 'tCy1 $ 	 $
  $ 
 $D$sCx.$379$HK$	$c S T r   r   )r6   r-   typingr   r   r   r   langchain_core.callbacksr   r$   r    r   r   <module>r=      s)    : 
 , , C7 N*H Nr   