
    h                     J    d Z ddlZddl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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     m/var/www/html/eduruby.in/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4#<#<<<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_start@   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_tokenI   s     	""5) '')"&D!!)) (AJJ$$Q'(

  " JJU#JJ r   )__name__
__module____qualname____doc__strr   boolr   r   listr!   dictr   r)   r0   __classcell__)r$   s   @r   r
   r
      s    -3 -4 -= = 59!# $ 'tCy1 $ 	 $
  $ 
 $D$cN$ c$ 	$
 
$c S T r   r
   )	r4   r+   typingr   r   langchain_core.callbacksr   r"   r
    r   r   <module>r=      s&    : 
   C7 P*H Pr   