
    3fi                     R    d Z ddlZddlmZ ddl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)StreamingStdOutCallbackHandler)override)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   dz  dededdf fdZ	e
deeef   dee   deddfd       Ze
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)z Append token to the last tokens.r   N)last_tokensappendlast_tokens_strippedstriplenanswer_prefix_tokenspop)selfr   s     u/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_classic/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 )z%Check if the answer has been reached.)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_startD   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_tokenN   s     	""5) '')"&D!!)) (AJJ$$Q'(

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